NumPy: использовать двумерный индексный массив из argmin в трехмерном слайсе - PullRequest
9 голосов
/ 21 июля 2011

Я пытаюсь индексировать большие трехмерные массивы, используя двумерный массив индикаторов из 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:])

На данный момент оба 3D-массива имеют одинаковую форму, а массив minax0 имеет форму (500, 335).Теперь я хотел бы присвоить значения из двумерного массива some2d трехмерному массиву 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, но яне найти ничего элегантногоТребуется ли для этого расширенный индекс ?Любые советы?

1 Ответ

9 голосов
/ 21 июля 2011

Необычное индексирование может быть немного не интуитивным. К счастью, у руководства есть несколько хороших примеров.

По сути, вам нужно определить j и k, к которым относится каждый minidx. Numpy не выводит его из формы.

в вашем примере:

i = minax0
k,j = np.meshgrid(np.arange(335), np.arange(500))
othercube[i,j,k] = some2d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...