#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. Я верю, что ответ Свена сработает.