我在理解documentation of np.einsum()
时遇到了麻烦。 np.einsum()
如何解释?
我正在尝试在原始python上写subscripts
,其中np.einsum('a...c,b...c', Y, conj(Y))
是形状为Y
的矩阵。另外,由于先前的实现差异,我的MATLAB C, F, T
的大小为Y
。
[F, T, C]
在每个组件中的索引是什么?我很困惑。
如何在MATLAB中编写相同的指令?
从'a...c,b...c'
文档页面引用:
要启用和控制广播,请使用省略号。默认的NumPy样式广播是通过在每个术语的左侧添加省略号来完成的,例如
einsum
。要沿第一个轴和最后一个轴进行跟踪,可以执行np.einsum('...ii->...i', a)
,或者使用最左边的索引而不是最右边的索引做矩阵矩阵乘积,可以执行np.einsum('i...i', a)
。
稍后,给出一个例子:
np.einsum('ij...,jk...->ik...', a, b)
此示例的等效MATLAB代码为:
>>> a = np.arange(25).reshape(5,5)
>>> np.einsum('...j->...', a)
array([ 10, 35, 60, 85, 110])
需要注意的几件事:
>> a = reshape(0:24, [5,5]).';
>> sum(a,2).'
ans =
10 35 60 85 110
)不应理解为“范围”,而应理解为“任何需要存在的地方”。 ...
”是指沿着相关维度自动复制数组,以便定义数学运算。自R2016b起,此功能就存在于MATLAB中(称为“隐式扩展”)。这些文档的另一个示例是:
.'
可以在MATLAB中编写如下:
>>> a = np.arange(6).reshape((3,2)) >>> b = np.arange(12).reshape((4,3)) >>> np.einsum('ki,jk->ij', a, b) array([[10, 28, 46, 64], [13, 40, 67, 94]]) >>> np.einsum('ki,...k->i...', a, b) array([[10, 28, 46, 64], [13, 40, 67, 94]]) >>> np.einsum('k...,jk', a, b) array([[10, 28, 46, 64], [13, 40, 67, 94]])
需要注意的几件事:
A = reshape(0:5, [2 3]).';
B = reshape(0:11, [3 4]).';
A.' * B.'
permute(sum( permute(A, [3 1 2]) .* B,2), [3 1 2])
shiftdim(sum( shiftdim(A, -1) .* B, 2), 2)
到np.einsum('ki,jk->ij', a, b)
时,您可以看到第np.einsum('ki,...k->i...', a, b)
个维度被j
替换。这两个示例中都带有一个...
的事实意味着它处于显式模式。->
转到np.einsum('ki,jk->ij', a, b)
时,您可以看到现在将np.einsum('k...,jk', a, b)
的尺寸替换为i
。省略...
只是演示隐式模式