Использование numpy.argmax() для многомерных массивов

У меня есть 4-мерный массив, то есть data.shape = (20,30,33,288). Я нахожу индекс ближайшего массива к n, используя

index = abs(data - n).argmin(axis = 1), so
index.shape = (20,33,288) with the indices varying. 

Я хотел бы использовать data[index] = "values" с values.shape = (20,33,288), но data[index] возвращает ошибку "индекс (8) вне диапазона (0‹=индекс‹1) в измерении 0" или эта операция занимает относительно много времени для вычисляет и возвращает матрицу формы, которая кажется бессмысленной.

Как вернуть массив правильных значений? то есть,

data[index] = "values" with values.shape = (20,33,288)

Это кажется простой проблемой, есть ли простой ответ?

В конечном итоге я хотел бы найти index2 = abs(data - n2).argmin(axis = 1), чтобы я мог выполнить операцию, скажем, суммировать данные в индексе с данными в индексе2 без циклического перебора переменных. Это возможно?

Я использую python2.7 и numpy версии 1.5.1.


person NPB    schedule 27.04.2011    source источник


Ответы (2)


Вы должны иметь возможность получить доступ к максимальным значениям, проиндексированным index, используя numpy.indices():

x, z, t = numpy.indices(index.shape)
data[x, index, z, t]
person Sven Marnach    schedule 27.04.2011
comment
Есть ли также ответ, когда человек не знает ndim? - person Andreas Mueller; 18.08.2012
comment
@AndreasMueller: Да, используйте tup[:axis] + (index,) + tup[axis:] в качестве индекса для data, где tup — это кортеж, возвращаемый numpy.indices(). - person Sven Marnach; 23.08.2012

Если я вас правильно понял, это должно работать:

numpy.put(data, index, values)

Сегодня узнал кое-что новое, спасибо.

person Alok Singhal    schedule 27.04.2011
comment
Спасибо за ответ. У меня нет значений, поэтому я не думаю, что смогу использовать numpy.put. Я считаю, что ответ Свена сработает. - person NPB; 27.04.2011