使用numpy einsum进行高维减法广播

时间:2019-04-01 15:06:55

标签: numpy matrix numpy-broadcasting numpy-einsum

我在使用广播减法时遇到麻烦。我的问题如下。我有一个形状为x的数组[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批量减法或加法运算?

0 个答案:

没有答案