Как транслировать цифровую индексацию по размерам партии? - PullRequest
2 голосов
/ 25 сентября 2019

Например, np.array([[1,2],[3,4]])[np.triu_indices(2)] имеет форму (3,), представляющую собой сплющенный список верхних треугольных записей.Однако, если у меня есть партия матриц 2x2:

foo = np.repeat(np.array([[[1,2],[3,4]]]), 30, axis=0)

, и я хочу получить верхние треугольные индексы каждой матрицы, наивная вещь, которую стоит попробовать:

foo[:,np.triu_indices(2)]

Однако этот объект на самом деле имеет форму (30,2,3,2) (в отличие от (30,3), который мы могли бы ожидать, если бы извлекли верхние треугольные записи в пакетном режиме.

Как мы можем транслировать индексирование кортежей по размерам пакета

1 Ответ

2 голосов
/ 25 сентября 2019

Получить кортежи и использовать их для индексации двух последних димов -

r,c = np.triu_indices(2)
out = foo[:,r,c]

В качестве альтернативы, однострочный с Ellipsis, который работает как для массивов 3D, так и 2D -

foo[(Ellipsis,)+np.triu_indices(2)]

Он будет работать для 2D массивов аналогично -

out = foo[r,c] # foo as 2D input array

Способ маскирования

Случай с массивом 3D

Мы также можем использовать маску для masking способа -

foo[:,~np.tri(2,k=-1, dtype=bool)]

2D-массив массива

foo[~np.tri(2,k=-1, dtype=bool)]
...