Есть ли эффективный способ вычислить значение в массиве numpy на основе его местоположения в массиве? - PullRequest
0 голосов
/ 27 мая 2020

Я задам свой вопрос на примере. Допустим, у меня есть два массива numpy:

A = [(1 2 3),(4,5,6)]

B=[(1 2 3),(4,5,6),(7,8,9]

Я sh, чтобы создать новый массив numpy S, где каждый ячейка вычисляется с использованием ее координат относительно A и B. например: S_ij = exp ((i-я строка A) ^ T * (j-я строка B))

Есть ли способ сделать это в numpy без использования петель? Извините, если мой вопрос немного запутан.

Спасибо!

1 Ответ

0 голосов
/ 27 мая 2020
In [138]: A = np.arange(1,7).reshape(2,3)                                                
In [139]: B = np.arange(1,10).reshape(3,3)    

Используя broadcasting, мы можем взять строки из двух массивов:

In [140]: (A[:,None,:]*B[None,:,:]).shape                                                
Out[140]: (2, 3, 3)
In [141]: np.exp((A[:,None,:]*B[None,:,:]))                                              
Out[141]: 
array([[[2.71828183e+00, 5.45981500e+01, 8.10308393e+03],
        [5.45981500e+01, 2.20264658e+04, 6.56599691e+07],
        [1.09663316e+03, 8.88611052e+06, 5.32048241e+11]],

       [[5.45981500e+01, 2.20264658e+04, 6.56599691e+07],
        [8.88611052e+06, 7.20048993e+10, 4.31123155e+15],
        [1.44625706e+12, 2.35385267e+17, 2.83075330e+23]]])

* поэлементно; возможно, вам нужно `точечный / матричный продукт, сумма на последнем тусклом изображении:

In [142]: np.sum((A[:,None,:]*B[None,:,:]),axis=-1).shape                                
Out[142]: (2, 3)
In [143]: np.exp(np.sum((A[:,None,:]*B[None,:,:]),axis=-1))                              
Out[143]: 
array([[1.20260428e+06, 7.89629602e+13, 5.18470553e+21],
       [7.89629602e+13, 2.75851345e+33, 9.63666567e+52]])

einsum - удобный инструмент для создания матричного произведения:

In [144]: np.exp(np.einsum('ij,kj->ik',A,B))                                             
Out[144]: 
array([[1.20260428e+06, 7.89629602e+13, 5.18470553e+21],
       [7.89629602e+13, 2.75851345e+33, 9.63666567e+52]])

или с помощью матрицы оператор продукта:

In [145]: np.exp(A@B.T)                                                                  
Out[145]: 
array([[1.20260428e+06, 7.89629602e+13, 5.18470553e+21],
       [7.89629602e+13, 2.75851345e+33, 9.63666567e+52]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...