как интерпретировать np.einsum ("ijij-> ij" - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь понять np.einsum, и, похоже, нет примеров, связанных с моим c контекстом. Есть много хороших примеров в numpy docs , в руководстве здесь , здесь и в ответе на переполнение стека здесь .

Однако

Нет примера, похожего на мою проблему: np.einsum("ijij->ij", padded_matrix)

, где, когда я выводю padded_matrix, я получаю

     >> padded_matrix  

>> [[[[[1.         0.         0.         0.33333333 0.         0.33333333]]

   [[0.         1.         0.         0.         0.         0.        ]]

   [[0.         0.         1.         0.         0.         0.        ]]

   [[0.33333333 0.         0.         1.         0.         0.33333333]]

   [[0.         0.         0.         0.         1.         0.        ]]

   [[0.33333333 0.         0.         0.33333333 0.         1.        ]]]]]

padded_matrix is длина 1, и составляет <class 'numpy.ndarray'>. К сожалению, копирование вывода для матрицы с дополнениями не работает. В реальной программе padded_matrix - это вызов функции, слишком сложной для включения сюда, поэтому я скопировал ее вывод.

Результат: [[1. 1. 1. 1. 1. 1.]], но я не могу понять, как элементы были умножены и затем, какая ось была суммирована.

Учитывая, что я не предоставил рабочий MWE, если кто-нибудь может просто сказать мне, что «ijij-> ij» должен делать в контексте данного padded_matrix как <class 'numpy.ndarray'>, Я был бы признателен.

Я предполагаю, что

np.einsum("ii->i,A") просматривает диагональ матрицы A, значит ли это, что в этом случае i эффективно заменяется ij из-за заполнения, так что np.einsum("ijij->ij",padded_matrix) - это вид на диаганол?

1 Ответ

1 голос
/ 26 мая 2020

Умножения нет, так как есть только один аргумент:

In [25]: arr = np.arange(36).reshape(1,6,1,6)                                            
In [26]: arr                                                                             
Out[26]: 
array([[[[ 0,  1,  2,  3,  4,  5]],

        [[ 6,  7,  8,  9, 10, 11]],

        [[12, 13, 14, 15, 16, 17]],

        [[18, 19, 20, 21, 22, 23]],

        [[24, 25, 26, 27, 28, 29]],

        [[30, 31, 32, 33, 34, 35]]]])
In [27]: np.einsum('ijij->ij', arr)                                                      
Out[27]: array([[ 0,  7, 14, 21, 28, 35]])

Это einsum фактически diagonal.

In [29]: np.einsum('ii->i', arr.squeeze())                                               
Out[29]: array([ 0,  7, 14, 21, 28, 35])
In [30]: np.diagonal(arr.squeeze())                                                      
Out[30]: array([ 0,  7, 14, 21, 28, 35])
...