用Python迭代
我有两个数组,从这两个数组中,我必须以这种方式创建另一个数组:用Python迭代,python,iteration,Python,Iteration,我有两个数组,从这两个数组中,我必须以这种方式创建另一个数组: for i in arange(0,len(second_array),1): third_array[i] = my_function(first_array[i],second_array[i]) 这里的my_函数是一个将两个标量作为输入,然后返回另一个标量的过程。我的问题是,我通常使用的阵列是巨大的,因此上面的循环会花费很长时间。是否有一种方法可以避免循环,但仍然以我想要的方式填充数组third_array 如
for i in arange(0,len(second_array),1):
third_array[i] = my_function(first_array[i],second_array[i])
这里的
my_函数
是一个将两个标量作为输入,然后返回另一个标量的过程。我的问题是,我通常使用的阵列是巨大的,因此上面的循环会花费很长时间。是否有一种方法可以避免循环,但仍然以我想要的方式填充数组third_array
如果需要访问两个列表的每个元素,如何避免循环?我不太明白你的问题
但你可以做得更简单一点。在Python 3中:
third_array = [my_function(a, b) for a, b in zip(first_array, second_array)]
在Python2中,最好使用
from itertools import izip
third_array = [my_function(a, b) for a, b in izip(first_array, second_array)]
如果需要访问两个列表的每个元素,如何避免循环?我不太明白你的问题 但你可以做得更简单一点。在Python 3中:
third_array = [my_function(a, b) for a, b in zip(first_array, second_array)]
在Python2中,最好使用
from itertools import izip
third_array = [my_function(a, b) for a, b in izip(first_array, second_array)]
由于您使用的是
arange
,我认为您使用的是NumPy。尝试重写my_函数
,使其采用两个数组而不是两个标量值,并使用矢量化操作。由于您使用的是arange
,我认为您使用的是NumPy。尝试重写my_函数
,使其采用两个数组而不是两个标量值,并使用矢量化操作。既然您已经在使用NumPy,可能值得探索(ufunc
)和
需要注意的是,由PyFunc创建的UFUNC总是返回PyObject数组。我不确定是否有办法解决这个问题。既然您已经在使用NumPy,可能值得探索(
ufunc
)和
需要注意的是,由PyFunc创建的UFUNC总是返回PyObject数组。我不确定是否有办法解决这个问题。使用
map
似乎比理解列表要快一些:
import cProfile, numpy as np
from operator import add
A = np.random.rand(1000000)
B = np.random.rand(1000000)
>>> cProfile.run('C = map(add, A, B)')
3 function calls in 0.693 seconds
>>> cProfile.run('C = [a+b for a,b in izip(A,B)]')
2 function calls in 0.765 seconds
>>> cProfile.run('for i in np.arange(0,len(B),1): C[i] = A[i]+B[i]')
4 function calls in 1.971 seconds
但正如@larsmans所说,使用矢量化解决方案会更快:
>>> cProfile.run('C = A + B')
2 function calls in 0.005 seconds
使用
map
似乎比列表理解稍微快一些:
import cProfile, numpy as np
from operator import add
A = np.random.rand(1000000)
B = np.random.rand(1000000)
>>> cProfile.run('C = map(add, A, B)')
3 function calls in 0.693 seconds
>>> cProfile.run('C = [a+b for a,b in izip(A,B)]')
2 function calls in 0.765 seconds
>>> cProfile.run('for i in np.arange(0,len(B),1): C[i] = A[i]+B[i]')
4 function calls in 1.971 seconds
但正如@larsmans所说,使用矢量化解决方案会更快:
>>> cProfile.run('C = A + B')
2 function calls in 0.005 seconds