2017-01-04 5 views
4

Пусть X - матрица M x N. Обозначим xi i-й столбец X. Я хочу создать трехмерную матрицу N x M x M, состоящую из матриц M x M xi.dot(xi.T).Внешнее произведение каждого столбца 2D-массива для формирования 3D-массива - NumPy

Как я могу сделать это наиболее элегантно с numpy? Можно ли это сделать, используя только операции с матрицами без петель?

+0

Звучит как работа для np.einsum. – user2357112

+0

@Divakar Спасибо, отредактирован. Теперь X является матрицей M x N. – Virtuoz

+0

Кажется, что (строки, столбцы) были перемешаны здесь ... Чтобы использовать конкретные числа, предположим, что мы начинаем с (Mrows, Ncols) = (2,3). OP использует операции столбцового вектора 'Ni * Ni.T'. Каждый столбец имеет длину Mrows = 2, поэтому произведение дает матрицу (2,2) - то есть (перемещается, раскладывается). Выполнение этого для каждого столбца и укладка результата в третьем измерении должно привести к (M x M x N) матрице. –

ответ

4

Один подход с broadcasting -

X.T[:,:,None]*X.T[:,None] 

Другим с broadcasting и поменяв оси впоследствии -

(X[:,None,:]*X).swapaxes(0,2) 

Другого с broadcasting и многомерным транспонированием впоследствии -

(X[:,None,:]*X).T 

другими подход с np.einsum, что может быть более интуитивным мышлением в терминах итераторов, участвующих если вы переводите из петельной коды -

np.einsum('ij,kj->jik',X,X) 

Основной идеи всех этих подходов является то, что мы разложить последнюю ось для поэлементного умножения друг против друга, выравнивая первую ось. Мы достигаем этого способа размещения друг против друга путем расширения X до двух версий массива 3D.