純粋なpythonで2つの行列のテンソル積を実行する方法

2020-08-02 python linear-algebra

私はnp.kron関数によって行われていることを純粋なpythonで表現したいと思っています。

これらのリストがあるとしましょう:

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

v1にv2の各要素を乗算してリストのリストを作成する関数を定義したいと思います。したがって、これらの2つのリストは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の単位行列です。それは私が探しているものです。

Answers

この画像のように、計算が正しい順序で行われていることを確認する必要があります。これはタイトルではなく問題の説明で述べたものであるため、これはテンソル積ではなくクロネッカー積であることに注意してください。

ここに画像の説明を入力してください

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

Related