У меня есть трехмерный массив numpy. Каков самый быстрый способ получить 3D-массив, содержащий самый большой элемент каждой конечной оси массива, без написания цикла. (Позже я буду использовать CuPy с тем же синтаксисом, и циклы уберут параллелизм графического процессора и скорость что здесь является самым важным фактором.)
Получить индексы для самых крупных элементов легко:
>>> arr = np.array(
[[[ 6, -2, -6, -5],
[ 1, 12, 3, 9],
[21, 7, 9, 8]],
[[15, 12, 20, 12],
[17, 15, 17, 23],
[22, 18, 27, 32]]])
>>> indexes = arr.argmax(axis=2, keepdims=True)
>>> indexes
array([[[0],
[1],
[0]],
[[2],
[3],
[3]]])
но как использовать эти индексы для получения выбранных значений из arr? Все способы, которые я пробовал, либо приводят к ошибкам (например, arr[indexes]), либо к неверным результатам. В этом примере я хотел бы получить
array([[[6],
[12],
[21]],
[[20],
[23],
[32]]])
Спасибо! Я предполагал, что будет простой ответ, но не смог найти его среди множества функций numpy.
Действительно ли вам нужен промежуточный этап получения индексов самых больших элементов? Если вас интересуют только самые крупные элементы, вы можете использовать np.amax()
, как предложено в ответе «неплательщика налогов» ниже. Также вы можете отдать должное тем, кто вам помог, (1) проголосовав за ответы, которые вы считаете полезными, и (2) приняв ответ, который решает вашу проблему.
Я обязательно проголосую за тех, кто помог, когда я впервые наберу достаточно очков для голосования (= 15 очков репутации), сейчас у меня 11 очков.... В моем конкретном случае мне нужна информация об индексах, но в этом нет необходимости. np.amax() действительно был бы лучше. Я собирался прокомментировать это после ответа «неплательщика налогов», но потом прочитал руководство, в котором якобы «Комментарии используются для запроса разъяснений или для указания проблем в сообщении». Это мой второй пост, я перестраховался и еще не оставлял подобных комментариев.
@Mikael Спасибо за разъяснения. Извините, я не помню, чтобы было минимальное количество баллов для голосования. В любом случае: добро пожаловать в Stack Overflow!
Думаю, для этого можно использовать np.amax
import numpy as np
arr = np.array(
[[[ 6, -2, -6, -5],
[ 1, 12, 3, 9],
[21, 7, 9, 8]],
[[15, 12, 20, 12],
[17, 15, 17, 23],
[22, 18, 27, 32]]])
max_arr = np.amax(arr, axis=2, keepdims=True)
print(max_arr)
Выход
[[[ 6]
[12]
[21]]
[[20]
[23]
[32]]]
Спасибо! Если бы информация о том, какие индексы были самыми большими, не требовалась, этот ответ был бы идеальным.
Как указал hpaulj, вы можете использовать take_along_axis
>>>arr = np.array(
[[[ 6, -2, -6, -5],
[ 1, 12, 3, 9],
[21, 7, 9, 8]],
[[15, 12, 20, 12],
[17, 15, 17, 23],
[22, 18, 27, 32]]])
>>>indexes = arr.argmax(axis=2, keepdims=True)
>>>np.take_along_axis(arr , indexes , axis=2)
array([[[6],
[12],
[21]],
[[20],
[23],
[32]]])
argmax
документы советуют вам посмотретьtake_along_axis
numpy.org/doc/stable/reference/generated/…