2012-01-09 91 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陣列。我不確定是否有辦法解決這個問題。