我在使用广播减法时遇到了麻烦。我的问题如下。x
我有一个shape数组[L,N]
,其中 L 是一个整数,N 是我的问题的变量数。我需要计算一个[L,N,N]
数组,其中每个元素l,i,j
包含它x[l,i]-x[l,j]
。如果 L=1 这相当于在减法上运行广播:x-x.T
例如这里 L=1 和 N=3:
import numpy as np
x = np.array([[0,2,4]])
x-x.T
但是,如果增加维数 L,事情就会变得更加复杂并进入np.einsum
函数领域。所以我尝试重新创建我的示例,在 L=2 的情况下,我复制了两行。我期望得到一个 2x3x3 数组,其中包含两个元素相等的 3x3 矩阵。
x = np.array([[0,2,4],[0,2,4]])
n = 3
k = 2
X = np.zeros([k,n,n])
for l in range(k):
for i in range(n):
for j in range(n):
X[l,i,j] = x[l,i]-x[l,j]
print(X)
返回
[[[ 0. -2. -4.]
[ 2. 0. -2.]
[ 4. 2. 0.]]
[[ 0. -2. -4.]
[2. 0. -2.]
[ 4. 2. 0.]]]
但是如何用 numpy einsum 做到这一点?我只能获得产品:
np.einsum('ki,kj->kij',x,-x)
有没有增加维度的 numpy 批量减法或加法的具体示例?