2012-01-20 245 views
2

什麼是Matlab中以下簡單代碼的等效pythonic實現。Python:多維數組屏蔽

Matlab的:


B = 2D array of integers as indices [1...100] 
A = 2D array of numbers: [10x10] 
A[B] = 0 

如例如,其可以很好地用於B[i]=42它找到的位置5柱的2進行設置。 在的Python它導致出錯:結合邏輯。但是要將上面的Matlab代碼翻譯成Python,我們正在尋找pythonic方法。 也請考慮更高的維度,如問題:我們想過


B = 2D array of integers as indices [1...3000] 
C = 3D array of numbers: [10x10x30] 
C[B] = 0 

的方法之一是改革指數數組元素作爲i,j,而不是被絕對位置。也就是說,位置42divmod(42,m=10)[::-1] >>> (2,4)。所以我們將有一個nx2 >>> ii,jj向量的索引,可以很容易地用於索引A。 我們認爲這可能是一種更好的方式,對於更高維的高效率,Python

+0

「在Python它會導致一個錯誤:總分這是合乎邏輯的「......這是什麼原因造成的?你能展示你用Python試過的東西嗎? –

+0

爲什麼使用二維數組作爲另一個二維數組的索引? – 0605002

+1

@LaurenceGonsalves正如問題中所提到的,A.shape =(10,10)所以用A [42]索引是不合法的!對於Matlab代碼,情況並非如此,因爲它自動將第42行與第2行和第4列匹配。 – Developer

回答

5

您可以在索引它之前在數組(A)上使用.ravel(),然後在.reshape()之後。

或者,既然您知道A.shape,您可以在索引之前在另一個陣列(B)上使用np.unravel_index

實施例1:

>>> import numpy as np 
>>> A = np.ones((5,5), dtype=int) 
>>> B = [1, 3, 7, 23] 
>>> A 
array([[1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1]]) 
>>> A_ = A.ravel() 
>>> A_[B] = 0 
>>> A_.reshape(A.shape) 
array([[1, 0, 1, 0, 1], 
     [1, 1, 0, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 0, 1]]) 

實施例2:

>>> b_row, b_col = np.vstack([np.unravel_index(b, A.shape) for b in B]).T 
>>> A[b_row, b_col] = 0 
>>> A 
array([[1, 0, 1, 0, 1], 
     [1, 1, 0, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 0, 1]]) 

後來發現:可以使用numpy.put

>>> import numpy as np 
>>> A = np.ones((5,5), dtype=int) 
>>> B = [1, 3, 7, 23] 
>>> A.put(B, [0]*len(B)) 
>>> A 
array([[1, 0, 1, 0, 1], 
     [1, 1, 0, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [1, 1, 1, 0, 1]]) 
+2

謝謝你的例子。我打算讓你用一個例子來展示你的解決方案,哇!你在我發佈之前做過。通過這些例子,這個想法現在已經很清楚兩種方法都有幫助。 – Developer