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 中的更高维度也是有效的。
答案 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}}