您可以使用np.einsum进行操作,因为它可以非常小心地控制哪些轴相乘,哪些相加:
>>> np.einsum('ijk,ij->ik', ind, dist)
array([[ 0.4, 0.4, 0.4, 0.4],
[ 3. , 3. , 3. , 3. ],
[ 1. , 1. , 1. , 1. ]])
该函数将ind的第一个轴中的条目与dist(下标’i’)的第一个轴中的条目相乘.同一个数组的第二个轴(下标“j”).而不是返回一个3D数组,我们告诉einsum通过从输出下标中省略它来沿轴’j’求和,从而返回一个2D数组.
np.tensordot更难适用于这个问题.它自动求和轴的乘积.但是,我们想要两套产品,但只要求其中之一.
写入np.tensordot(ind,dist,axes = [1,1])(如您所链接的答案)为您计算正确的值,但返回一个具有形状(3,4,3)的3D数组.如果您能负担更大阵列的内存成本,您可以使用:
np.tensordot(ind, dist, axes=[1, 1])[0].T
这给了你正确的结果,但是因为tensordot首先创建一个大于必要的阵列,所以einsum似乎是一个更好的选择.