应用具有两个不同列表的公式
Apply formula with two different lists
我有两个这样的列表:
listA = [51, 988, 1336, 2067, 1857, 3160]
listB = [1, 2, 3, 4, 5, 6]
我必须在列表中应用这个公式:
n / pi * ((x*0.1)+1)**2 - pi * (x*0.1)**2
'n'是listA的元素,'x'是listB中'n'相同索引对应的元素。
我需要将此公式应用于两个列表中的所有元素。所以当循环第一次运行时需要这样做:
51/pi*((1*0.1)+1)**2 - pi *(1*0.1)**2
对于第二个,它需要这样做:
988/pi*((2*0.1)+1)**2 - pi*(2*0.1)**2
并且重复直到两个列表的末尾。
我知道我必须使用 'for' 循环,但我的问题是我不知道如何从第二个列表中获取元素。我正在尝试这样做:
for n in listA:
n/pi*((......))
括号内应该是listB 中的元素,但我不知道如何获取它们,并且它们需要与listA 中的元素具有相同的索引。
输出应该是第三个列表,其中包含应用每个公式的结果。
我已尽力以最好的方式解释自己,但如果您不理解我的问题,请随时提出任何问题。
提前致谢。
第一个公式的代码:
from math import pi
def func(l1, l2):
l = list()
for x,n in zip(l1, l2):
l.append(n / pi * ((x*0.1)+1)**2 - pi * (x*0.1)**2)
return l
listA = [51, 988, 1336, 2067, 1857, 3160]
listB = [1, 2, 3, 4, 5, 6]
print func(listA, listB)
输出:
[-69.86851405497168, -24325.709794885548, -38773.5481974975,
-79297.55058963387, -52859.75700368613, -121787.02310052476]
你可以zip()
他们:
for a, b in zip([1,2,3], [4,5,6]):
print a, b
会产生
1 4
2 5
3 6
我假设两个列表始终具有相同的大小,大多数 pythonic 方法是使用 lambda 和列表理解:
listA = [51, 988, 1336, 2067, 1857, 3160]
listB = [1, 2, 3, 4, 5, 6]
from math import pi
formula = lambda n,x: n / pi * ((x*0.1)+1)**2 - pi * (x*0.1)**2
res = [ formula(a,b) for a,b in zip(listA,listB) ]
>> [19.621466242038217,
452.96994140127384,
718.7747248407644,
1289.7268993630569,
1329.8678662420382,
2575.175332484077]
numpy 向量化 方法比常规 for/list comprehension/etc 方法 多 快。特别是在大名单上:
import numpy as np
listA = np.array([51, 988, 1336, 2067, 1857, 3160])
listB = np.array([1, 2, 3, 4, 5, 6])
result = listA / np.pi * ((listB*0.1)+1)**2 - np.pi * (listB*0.1)**2
输出:
In [175]: result
Out[175]: array([ 19.61148715, 452.74017757, 718.41005008, 1289.07255327, 1329.19288378, 2573.86868192])
两个 1M 列表的时间和比较:
In [183]: A = np.random.randint(1,100, 10**6)
In [184]: B = np.random.randint(1,100, 10**6)
In [185]: formula = lambda n,x: n / pi * ((x*0.1)+1)**2 - pi * (x*0.1)**2
矢量化 numpy 方法:
In [186]: %timeit formula(A, B)
10 loops, best of 3: 65.4 ms per loop
列表理解:
In [191]: %timeit [ formula(a,b) for a,b in zip(A.tolist(),B.tolist()) ]
1 loop, best of 3: 3.6 s per loop
结论:矢量化方法快 55 倍
我有两个这样的列表:
listA = [51, 988, 1336, 2067, 1857, 3160]
listB = [1, 2, 3, 4, 5, 6]
我必须在列表中应用这个公式:
n / pi * ((x*0.1)+1)**2 - pi * (x*0.1)**2
'n'是listA的元素,'x'是listB中'n'相同索引对应的元素。
我需要将此公式应用于两个列表中的所有元素。所以当循环第一次运行时需要这样做:
51/pi*((1*0.1)+1)**2 - pi *(1*0.1)**2
对于第二个,它需要这样做:
988/pi*((2*0.1)+1)**2 - pi*(2*0.1)**2
并且重复直到两个列表的末尾。
我知道我必须使用 'for' 循环,但我的问题是我不知道如何从第二个列表中获取元素。我正在尝试这样做:
for n in listA:
n/pi*((......))
括号内应该是listB 中的元素,但我不知道如何获取它们,并且它们需要与listA 中的元素具有相同的索引。 输出应该是第三个列表,其中包含应用每个公式的结果。
我已尽力以最好的方式解释自己,但如果您不理解我的问题,请随时提出任何问题。
提前致谢。
第一个公式的代码:
from math import pi
def func(l1, l2):
l = list()
for x,n in zip(l1, l2):
l.append(n / pi * ((x*0.1)+1)**2 - pi * (x*0.1)**2)
return l
listA = [51, 988, 1336, 2067, 1857, 3160]
listB = [1, 2, 3, 4, 5, 6]
print func(listA, listB)
输出:
[-69.86851405497168, -24325.709794885548, -38773.5481974975,
-79297.55058963387, -52859.75700368613, -121787.02310052476]
你可以zip()
他们:
for a, b in zip([1,2,3], [4,5,6]):
print a, b
会产生
1 4
2 5
3 6
我假设两个列表始终具有相同的大小,大多数 pythonic 方法是使用 lambda 和列表理解:
listA = [51, 988, 1336, 2067, 1857, 3160]
listB = [1, 2, 3, 4, 5, 6]
from math import pi
formula = lambda n,x: n / pi * ((x*0.1)+1)**2 - pi * (x*0.1)**2
res = [ formula(a,b) for a,b in zip(listA,listB) ]
>> [19.621466242038217,
452.96994140127384,
718.7747248407644,
1289.7268993630569,
1329.8678662420382,
2575.175332484077]
numpy 向量化 方法比常规 for/list comprehension/etc 方法 多 快。特别是在大名单上:
import numpy as np
listA = np.array([51, 988, 1336, 2067, 1857, 3160])
listB = np.array([1, 2, 3, 4, 5, 6])
result = listA / np.pi * ((listB*0.1)+1)**2 - np.pi * (listB*0.1)**2
输出:
In [175]: result
Out[175]: array([ 19.61148715, 452.74017757, 718.41005008, 1289.07255327, 1329.19288378, 2573.86868192])
两个 1M 列表的时间和比较:
In [183]: A = np.random.randint(1,100, 10**6)
In [184]: B = np.random.randint(1,100, 10**6)
In [185]: formula = lambda n,x: n / pi * ((x*0.1)+1)**2 - pi * (x*0.1)**2
矢量化 numpy 方法:
In [186]: %timeit formula(A, B)
10 loops, best of 3: 65.4 ms per loop
列表理解:
In [191]: %timeit [ formula(a,b) for a,b in zip(A.tolist(),B.tolist()) ]
1 loop, best of 3: 3.6 s per loop
结论:矢量化方法快 55 倍