Python:多维数组屏蔽

Python:多维数组屏蔽,python,matlab,numpy,multidimensional-array,masking,Python,Matlab,Numpy,Multidimensional Array,Masking,以下简单代码段在Matlab中的等效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,我们正在寻找Python的方法。 请考虑更高维度的问题,如: B = 2D array

以下简单代码段在Matlab中的等效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,我们正在寻找Python的方法。 请考虑更高维度的问题,如:


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

中对更高维度也是有效的。您可以在数组(a)上使用
.ravel()
,然后对其进行索引

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

“在Python中,它会导致一个错误:超出界限,这是合乎逻辑的”。。。这是什么原因?你能展示一下你在Python中尝试过什么吗?为什么你要用一个2D数组作为另一个2D数组的索引?@LaurenceGonsalves正如问题中提到的,a.shape=(10,10),所以用[42]进行索引是不合法的!这不是Matlab代码的情况,因为它会自动将42与第2行和第4列匹配。@FlopCoder,因为我正在翻译一个已经编写好的代码。我喜欢这里的Python逻辑,它
true
会导致错误。谢谢您的示例。我想请你用一个例子来演示你的解决方案,…哇!你在我发布之前就做了。有了这些例子,这个想法现在很清楚了。这两种方法都很有用。