2014-09-08 2 views
2

Я пытаюсь вычислить тензорное произведение (обновление: то, что я хотел на самом деле был назван Kronecker product, и это именование путаница, почему я не мог найти np.kron) из многократных матриц, так что я могу применить преобразования к векторам, которые сами по себе являются тензорным произведением множества векторов. У меня возникают проблемы с правильным выравниванием результата.NumPy Тензор/Кронекера произведение матриц выходит перемешиваются

Например, я хочу вычислить тензорное произведение [[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 | 

К сожалению, то, что я стараюсь все либо не выравнивать матрицу или придавить его слишком много или переставлять так что некоторые столбцы пустые. Более конкретно, вывод программы питона:

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

Ни один из которых является то, что я хочу.

Есть много других вопросов, подобных этому, но предлагаемые в них вещи не сработали (или, может быть, я пропустил те, которые работают). Может быть, «тензорный продукт» означает нечто несколько иное, чем я думал; но приведенный выше пример должен дать понять.

ответ

2

Из ответов на вопросы this и this вопрос, я узнал, что вы хотите, называется «Kronecker product». Это на самом деле построено в 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)) 
Смежные вопросы