2

我有2D numpy的陣列,我需要兩個嵌套循環遍歷它的每個元素。我想要在嵌套循環的一些量化,但我不斷收到一個錯誤說,向量化操作:Python的

j= np.arange (0,x.shape [1]) 
IndexError: tuple index out of range 

這些都是原來的嵌套循環:

for k in range(A.shape[0]): 
     for j in range(A.shape[1]): 
      A[k,j] = method1(x[k],x[j],a,c0,c1) 

這是我如何試圖基於矢量化,使上這個答案,https://codereview.stackexchange.com/questions/17702/python-numpy-running-15x-slower-than-matlab-am-i-using-numpy-effeciently

j= np.arange (0, A.shape [1]) 
    for k in range(A.shape[0]): 

      A[k,j] = method1(x[k],x[j],a,c0,c1) 

我試圖改變指數在np.arange,但沒有奏效。

誰能告訴我如何解決這一問題?

謝謝。編輯:通過@ajcr評論,我的錯誤是在這一行,j = np.arange(0,x.shape [1]),我本來應該使用2D數組「A」的列數作爲j = np.arange(0,A.shape [1]),但我錯誤地使用了一維數組x,因此錯誤。它現在工作完美。

+1

的'IndexError'爲'x.shape [1]''意味着僅x'有一個維度 - 你確定它是2D? –

+1

哦!對於這個錯誤,我真的很抱歉,我應該把它作爲,j = np.arange(0,A.shape [1])。非常感謝您的評論,它現在工作完美,比以前快得多:) – Dania

+0

我將編輯我的問題並指出錯誤。 – Dania

回答

2

這是很難給你一個答案,因爲你沒有提供的功能本身。如果可以對您的計算進行矢量化,這將是一條可行的路線。否則,你可以使用np.vectorize

import numpy as np 

def my_fun(x,y,a,b): 
    if x > y: 
     return a*x**2 + y 
    else: 
     return b*x**2 + a*y 

vec_fun = np.vectorize(my_fun) 
x = np.random.rand(100000) 
y = np.random.rand(100000) 

%%timeit 
for xx,yy in zip(x,y): 
    my_fun(xx,yy,1,2) 

10圈,最好的3:每圈138毫秒

%%timeit 
    vec_fun(x,y,1,2) 

10圈,最好的3:每循環

65.4毫秒如果你只是循環輸入參數列表,您可以使用multiprocessing.Pool以利用所有核心。

編輯:由於黑貓指出,該np.vectorize功能可能不會加快東西。如果是這種情況,我能想到的唯一解決方案是使用所有內核或切換到Cython。

+0

謝謝你的明確解釋,我也會嘗試你的建議。 – Dania

+1

從文件「中的'vectorize'功能主要是爲了方便而提供,而不是性能的實現基本上是一個for循環。」所以這不是OP真正想要的。我的結果的循環時間爲94.8毫秒,向量化時間爲271毫秒,所以使用'vectorize'的版本實際上比較慢。 – TheBlackCat

+0

好點。我忘了那個。但性能差異困擾我。 – Moritz