1

我想获得两个具有相同形状的数组的张量点,并应用了与索引相关的权重,而不使用显式循环。例如,

import numpy as np
    
A=np.array([1,2,3])
B=np.array([-2,6,9])
C=np.zeros((3,3))
for i in range(3):
     for j in range(3):
          C[i,j]=A[i]*B[j]*(np.exp(i-j)if i>j else 0)

C可以使用内置工具(例如,使用 tensordot 的一些选项)获得类似的数组吗?

4

2 回答 2

1

这是一个矢量化的解决方案:

N = 3
C = np.tril(A[:, None] * B * np.exp(np.arange(N)[:, None] - np.arange(N)), k=-1)

输出:

>>> C
array([[ -2.        ,   0.        ,   0.        ],
       [-10.87312731,  12.        ,   0.        ],
       [-44.33433659,  48.92907291,  27.        ]])
于 2022-02-21T18:35:51.747 回答
0

对于np.einsum某些较大的输入,与广播相比,速度不一致地稍快,而对于其他输入则较慢。

import numpy as np
    
A=np.array([1,2,3])
B=np.array([-2,6,9])

np.einsum('ij,i,j->ij', np.tril(np.exp(np.subtract.outer(A,A)), -1), A, B)

输出

array([[  0.        ,   0.        ,   0.        ],
       [-10.87312731,   0.        ,   0.        ],
       [-44.33433659,  48.92907291,   0.        ]])
于 2022-02-21T20:28:25.050 回答