gpt4 book ai didi

python - 为什么tensordot/reshape与kron不一致?

转载 作者:行者123 更新时间:2023-12-01 09:05:08 25 4
gpt4 key购买 nike

如果我定义一个形状为 (2, 2) 的数组 X:

X = np.array([[1, 2], [3, 4]])

并获取克罗内克乘积,然后使用

reshape 输出
np.kron(X, X).reshape((2, 2, 2, 2))

我得到一个结果矩阵:

array([[[[ 1,  2],
[ 2, 4]],

[[ 3, 4],
[ 6, 8]]],


[[[ 3, 6],
[ 4, 8]],

[[ 9, 12],
[12, 16]]]])

但是,当我使用np.tensordot(X, X,axes=0)时,会输出以下矩阵

array([[[[ 1,  2],
[ 3, 4]],

[[ 2, 4],
[ 6, 8]]],


[[[ 3, 6],
[ 9, 12]],

[[ 4, 8],
[12, 16]]]])

这与第一个输出不同。为什么会这样呢?我发现this在寻找答案时,但我不明白为什么该解决方案有效,也不明白如何推广到更高的维度。

最佳答案

我的第一个问题是,为什么你期望它们是相同的?

让我们做kron无需 reshape :

In [403]: X = np.array([[1, 2],
...: [3, 4]])
...:
In [404]: np.kron(X,X)
Out[404]:
array([[ 1, 2, 2, 4],
[ 3, 4, 6, 8],
[ 3, 6, 4, 8],
[ 9, 12, 12, 16]])

很容易将操作可视化。

[X*1, X*2
X*3, X*4]

tensordot通常被认为是 np.dot 的概括,能够处理比常见矩阵乘积(即一个或多个轴上的乘积之和)更复杂的情况。但这里没有求和。

In [405]: np.tensordot(X,X, axes=0)
Out[405]:
array([[[[ 1, 2],
[ 3, 4]],

[[ 2, 4],
[ 6, 8]]],


[[[ 3, 6],
[ 9, 12]],

[[ 4, 8],
[12, 16]]]])

何时 axes是一个整数而不是一个元组,该操作有点难以理解。文档说:

``axes = 0`` : tensor product :math:`a\otimes b`

我只是试图解释 axes 时发生的情况是一个标量(这并不简单) How does numpy.tensordot function works step-by-step?

指定axes=0相当于提供这个元组:

np.tensordot(X,X, axes=([],[]))

无论如何,从输出中可以明显看出这个张量点产生相同的数字 - 但布局与 kron 不同。 。

我可以复制 kron布局与

In [424]: np.tensordot(X,X,axes=0).transpose(0,2,1,3).reshape(4,4)
Out[424]:
array([[ 1, 2, 2, 4],
[ 3, 4, 6, 8],
[ 3, 6, 4, 8],
[ 9, 12, 12, 16]])

也就是说我交换了中间的两个轴。

省略 reshape ,我得到与 kron 相同的 (2,2,2,2) :

np.tensordot(X,X,axes=0).transpose(0,2,1,3)
<小时/>

我喜欢 np.einsum 的明确性:

np.einsum('ij,kl->ijkl',X,X)    # = tensordot(X,X,0)
np.einsum('ij,kl->ikjl',X,X) # = kron(X,X).reshape(2,2,2,2)

或者使用广播,这 2 个产品是:

X[:,:,None,None]*X[None,None,:,:]   # tensordot 0
X[:,None,:,None]*X[None,:,None,:] # kron

关于python - 为什么tensordot/reshape与kron不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52125078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com