2012-01-20 85 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