Python:多维数组掩码

时间:2012-01-20 06:27:43

标签: python matlab numpy multidimensional-array masking

Matlab中以下简单代码的等效pythonic实现。

Matlab的:


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

适用于例如B[i]=42,它会找到要设置的列2的位置5。 在 Python 中,它会导致 错误:超出范围 ,即逻辑。然而,为了将上述Matlab代码翻译成Python,我们正在寻找pythonic方法。 还请考虑更高维度的问题,例如:


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

我们考虑的一种方法是将索引数组元素改为i,j而不是绝对位置。也就是说,42位置为divmod(42,m=10)[::-1] >>> (2,4)。因此,我们将有一个nx2 >>> ii,jj个索引向量,可以轻松地为A编制索引。 我们认为这可能是一种更好的方法,对于 Python 中的更高维度也是有效的。

1 个答案:

答案 0 :(得分:5)

您可以在对数组(A)进行索引之前使用.ravel(),然后在.reshape()之后使用A.shape

或者,由于您知道np.unravel_index,因此您可以在编制索引之前在另一个数组(B)上使用>>> 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]])

示例1:

>>> 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]])

示例2:

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]])

{{1}}