Python 有没有一种有效的方法可以根据numpy数组中的位置来计算numpy数组中的值?

Python 有没有一种有效的方法可以根据numpy数组中的位置来计算numpy数组中的值?,python,numpy,Python,Numpy,我将用一个例子问我的问题。假设我有两个numpy阵列: A=[(1234,5,6)] B=[(1,2,3)、(4,5,6)、(7,8,9] 我希望创建一个新的numpy数组S,其中每个单元格都使用其相对于a和B的坐标进行计算。例如: S_ij=exp((A的第i行)^T*(B的第j行)) 有没有一种方法可以在numpy中做这样的事情而不使用循环?如果我的问题有点混乱,请原谅 谢谢 In [138]: A = np.arange(1,7).reshape(2,3)

我将用一个例子问我的问题。假设我有两个numpy阵列:

A=[(1234,5,6)]

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

我希望创建一个新的numpy数组S,其中每个单元格都使用其相对于a和B的坐标进行计算。例如: S_ij=exp((A的第i行)^T*(B的第j行))

有没有一种方法可以在numpy中做这样的事情而不使用循环?如果我的问题有点混乱,请原谅

谢谢

In [138]: A = np.arange(1,7).reshape(2,3)                                                
In [139]: B = np.arange(1,10).reshape(3,3)    
使用
广播
我们可以获取两个阵列的行:

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]]])
*
是元素;也许您想要点/矩阵积,即最后一个dim上的和:

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]])

这看起来就像一个矩阵积?比如,如果
a
b
是你展示的2x3和3x3数组,那么它就是
s=np.exp(a@b.T)
…我不确定我是否正确理解了这个问题。你的意思是:
s_12=np.exp(a[1].T)*b[2]
?我需要进行的实际计算比这要复杂一点,这只是我尝试做的一个例子。问题是我是否可以做一个函数f,我可以应用于a和B,当S=f(a,B)时,将根据其坐标计算每个S的单元格。这意味着在给定示例的上下文中:S11将是e^(1+4+9),S12将是e^(4+10+18)等。在您的示例中,
A
是(2,3)形状,
B
(3,3).s的形状是什么?
numpy
有很多以数组为输入的操作符和函数。你需要花一些时间来学习
numpy
的基础知识,包括关注
广播
。有效地使用
numpy
的诀窍是从整个数组的角度来思考,而不是关注焦点关于元素。