2012-01-09 65 views
1

我有两个阵列和来自这两个我要创建另一个以这种方式:迭代与Python

for i in arange(0,len(second_array),1): 
    third_array[i] = my_function(first_array[i],second_array[i]) 

这里my_function是取两个标量作为输入,然后返回另一个标量的过程。我的问题是我通常使用的数组非常庞大,因此上面的循环需要永久使用。有没有办法避免循环,但仍然填写我想要的方式third_array

+0

你能告诉我们创建my_function? – 2012-01-09 16:59:49

回答

1

使用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 
3

如果您需要访问这两个列表中的每个元素,如何避免循环?我真的不明白你的问题。

但你可以做得更简单一点。在Python 3:

third_array = [my_function(a, b) for a, b in zip(first_array, second_array)] 

在Python 2,这是更好的由于您使用arange使用

from itertools import izip 
third_array = [my_function(a, b) for a, b in izip(first_array, second_array)] 
4

,我想你正在使用NumPy的。尝试重写my_function,以便它使用两个数组而不是两个标量值并使用矢量化操作。

1

由于您已经在使用NumPy,因此可能值得探索universal functionsufunc)和numpy.frompyfunc()

In [1]: import numpy as np 

In [2]: first_array = np.arange(10) 

In [3]: second_array = np.arange(10, 20) 

In [5]: def halfsum(a, b): return (a + b)/2.0 
    ...: 

In [7]: halfsum_ufunc = np.frompyfunc(halfsum, 2, 1) 

In [8]: halfsum_ufunc(first_array, second_array) 
Out[8]: array([5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0], dtype=object) 

一个需要注意的是,frompyfunc -created ufuncs总是返回的PyObject阵列。我不确定是否有办法解决这个问题。