首页 > 解决方案 > 如何在纯python中执行2个矩阵的张量积

问题描述

我希望用纯 python 表达 np.kron 函数正在做什么。

假设我有这些列表:

v1 =  [1, 0, 0, 1]
v2 = [1, 0, 0, 1]

我想定义一个函数,通过将 v1 乘以 v2 中的每个元素来创建列表列表。所以这两个列表会产生 4 个列表:

[[1 * v1[0]],[0 * v1[1]],[ * v1[3]],[1 * v1[3]]]

目前,我一直在搞乱一堆东西。但不能让它工作。例如,当我运行此代码时,我得到一个 4x2 矩阵:

i = [[a*b for a in eye] for b in eye2]

>>[[1, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0], [1, 0, 0, 1]]

当我转换为 np.array 并重新格式化它时,它看起来不太正确:

print(np.array(i).reshape(4,4))

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

如果通过 np.kron (v1, v2),它将给出:

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

这是一个漂亮的 4 x 4 单位矩阵;这就是我要找的。

标签: pythonlinear-algebra

解决方案


您需要检查计算是否按照此图像中的正确顺序完成。请记住,这是克罗内克积而不是张量积,因为这是您在问题描述中所说的,而不是标题。

在此处输入图像描述

import numpy as np

v1 = [1, 0, 0, 1]
v2 = [1, 0, 0, 1]

v1 = np.array(v1).reshape(2, 2)
v2 = np.array(v2).reshape(2, 2)

i = [[num1 * num2 for num1 in elem1 for num2 in v2[row]] for elem1 in v1 for row in range(len(v2))]

print(' ')

print("With list comprehension: ")
print(np.array(i).reshape(4, 4))

print(' ')

print("With numpy kron: ")
print(np.kron(v1, v2))

推荐阅读