Python: маскирование многомерных массивов - PullRequest
2 голосов
/ 20 января 2012

Что эквивалентно Python-реализации для следующего простого куска кода в Matlab.

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 Ответ

5 голосов
/ 20 января 2012

Вы можете использовать .ravel() в массиве (A) перед его индексацией, а затем .reshape() после.

В качестве альтернативы, поскольку вы знаете A.shape, вы можете использовать np.unravel_index в другом массиве (B) перед индексацией.

Пример 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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...