Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python迭代_Python_Iteration - Fatal编程技术网

用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