Я пытаюсь проиндексировать большие 3D-массивы, используя 2D-массив индикаторов из argmin (или связанных функций argmax и т. д.). Вот мой пример данных:
import numpy as np
shape3d = (16, 500, 335)
shapelen = reduce(lambda x, y: x*y, shape3d)
# 3D array of [random] source integers
intcube = np.random.uniform(2, 50, shapelen).astype('i').reshape(shape3d)
# 2D array of indices of minimum value along first axis
minax0 = intcube.argmin(axis=0)
# Another 3D array where I'd like to use the indices from minax0
othercube = np.zeros(shape3d)
# A 2D array of [random] values I'd like to assign in othercube
some2d = np.empty(shape3d[1:])
На данный момент оба трехмерных массива имеют одинаковую форму, а массив minax0
имеет форму (500, 335). Теперь я хотел бы присвоить значения из 2D-массива some2d
3D-массиву othercube
, используя minax0
для позиции индекса первого измерения. Это то, что я пытаюсь, но не работает:
othercube[minax0] = some2d # or
othercube[minax0,:] = some2d
выдает ошибку:
ValueError: размеры слишком велики в причудливой индексации
Примечание: то, что я сейчас использую, но не очень NumPythonic:
for r in range(shape3d[1]):
for c in range(shape3d[2]):
othercube[minax0[r, c], r, c] = some2d[r, c]
Я рылся в сети, чтобы найти похожие примеры, которые могут проиндексировать othercube
, но не нашел ничего элегантного. Потребуется ли для этого расширенный индекс ? Какие-нибудь советы?