Pythonic способ получения значений с помощью матрицы индексов?

1

У меня есть Н-по-ш-с-3 NumPy массив A и другим ч-по-ш-с-2 Numpy массив B, который говорит мне, где, чтобы захватить значение из в при каждом (Н, W) местоположения. A Обозначим матрицу результатов через C (h-by-w-by-3).

Наивно, я могу сделать

C = np.zeros(A.shape)
for i in range(B.shape[0]):
    for j in range(B.shape[1]):
        C[i, j, :] = A[B[i, j, 0], B[i, j, 1], :]

Но я уверен, что там более эффективный, более питонический и более быстрый способ!

  • 0
    C = A[B[:, :, 0], B[:, :, 1]] ?
Теги:
numpy

1 ответ

2
Лучший ответ

Действительно:

>>> import numpy as np
>>> 
>>> h, w = 4, 6
>>> 
>>> A = np.random.randint(0, 100, (h, w, 3))
>>> B = np.random.randint(0, h*w, (h, w, 2)) % [h, w]
>>> 
>>> C = np.zeros(A.shape)
>>> for i in range(B.shape[0]):
...     for j in range(B.shape[1]):
...         C[i, j, :] = A[B[i, j, 0], B[i, j, 1], :]
... 
>>> 
>>> C2 = A[(*np.moveaxis(B, 2, 0),)]
>>> np.all(C == C2)
True
  • 0
    Удивительно. Кажется, что * делает магию здесь. Интересно, как на самом деле пробует оператор * ? Это сложно, как обычно внутри поля аргумента ...
  • 1
    @SibbsGambling В данном конкретном случае (*np.moveaxis(B, 2, 0),) на самом деле просто причудливый способ написания tuple(np.moveaxis(B, 2, 0)) . Смотрите, например, здесь .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню