как выполнить тензорное произведение двух матриц в чистом виде python - PullRequest
0 голосов
/ 02 августа 2020

Я ищу express в чистом виде python, что делает функция np.kron.

Допустим, у меня есть эти списки:

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

i хотел бы определить функцию, которая будет создавать список списков путем умножения 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; вот что я ищу.

1 Ответ

1 голос
/ 02 августа 2020

Вы должны убедиться, что вычисления выполняются в правильном порядке, как на этом изображении. Имейте в виду, что это произведение кронекера, а не тензорное произведение, поскольку это то, что вы указали в описании проблемы, а не в заголовке.

введите описание изображения здесь

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))
...