NumPy张量/矩阵的克罗内克积结果乱序

2 投票
1 回答
3724 浏览
提问于 2025-04-20 09:21

我正在尝试计算多个矩阵的 张量积(更新一下,我想要的其实是叫做 克罗内克积,这个名字的混淆让我找不到 np.kron),这样我就可以对那些本身是多个向量的张量积的向量进行变换。不过,我在正确地将结果压平时遇到了麻烦。

举个例子,假设我想计算 [[0,1],[1,0]] 和它自己之间的张量积。结果应该是这样的:

| 0*|0,1|   1*|0,1| |
|   |1,0|     |1,0| |
|                   |
| 1*|0,1|   0*|0,1| |
|   |1,0|     |1,0| |

然后我想把它压平成:

| 0 0 0 1 |
| 0 0 1 0 |
| 0 1 0 0 |
| 1 0 0 0 |

不幸的是,我尝试的所有方法都要么没能正确压平矩阵,要么压平得太过了,或者把元素的顺序搞乱了,导致某些列变成空的。更具体来说,下面这个 Python 程序的输出:

import numpy as np
flip = np.matrix([[0, 1], [1, 0]])
print np.tensordot(flip, flip, axes=0)
print np.reshape(np.tensordot(flip, flip, axes=0), (4, 4))

[[[[0 0]
   [0 0]]
  [[0 1]
   [1 0]]]
 [[[0 1]
   [1 0]]
  [[0 0]
   [0 0]]]]

[[0 0 0 0]
 [0 1 1 0]
 [0 1 1 0]
 [0 0 0 0]]

这两者都不是我想要的结果。

还有很多其他类似的问题,但里面建议的方法都没有奏效(或者我可能错过了那些有效的方法)。也许“张量积”的意思和我想的稍微有点不同;不过上面的例子应该能让人明白我的意思。

1 个回答

4

从对这个这个问题的回答中,我了解到你想要的东西叫做“克罗内克积”。这个功能其实已经在Numpy里内置了,所以你只需要这样做:

np.kron(flip, flip)

不过,如果你想让reshape的方法有效,首先需要重新排列张量中的行:

flip = [[0,1],[1,0]]
tensor4d = np.tensordot(flip, flip, axes=0)
print tensor4d.swapaxes(2, 1).reshape((4,4))

撰写回答