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

#python #indexing #numpy #closest

#python #индексирование #numpy #ближайший

Вопрос:

У меня есть 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" with 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.

Ответ №1:

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

 x, z, t = numpy.indices(index.shape)
data[x, index, z, t]
  

Комментарии:

1. Есть ли также ответ, когда кто-то не знает ndim?

2. @AndreasMueller: Да, используйте tup[:axis] (index,) tup[axis:] в качестве индекса для data , где tup — кортеж, возвращаемый numpy.indices() .

Ответ №2:

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

 numpy.put(data, index, values)
  

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

Комментарии:

1. Спасибо за ответ. У меня нет «значений», поэтому я не думаю, что смогу использовать numpy.put. Я верю, что ответ Свена сработает.