Умножение векторов столбцов и строк в Numpy

Я хотел бы умножить два вектора, один столбец (т. е. (N+1)x1), одну строку(т. е. 1x (N+1)), чтобы дать(N+1)x (N+1) матрицу. Я довольно новичок в Numpy, но имею некоторый опыт работы с MATLAB, это эквивалентный код в MATLAB тому, что я хочу в Numpy:

n = 0:N; 
xx = cos(pi*n/N)';
T = cos(acos(xx)*n');

в Numpy я пробовал:

import numpy as np
n = range(0,N+1)

pi = np.pi
xx = np.cos(np.multiply(pi / float(N), n))

xxa = np.asarray(xx)
na = np.asarray(n)
nd = np.transpose(na)

T = np.cos(np.multiply(np.arccos(xxa),nd))

я добавил строку asarray после того, как заметил, что без нее Numpy, казалось, рассматривал xx и n как списки. np.shape(n), np.shape(xx), np.shape(na) и np.shape(xxa) дает тот же результат: (100001L,)

2 ответов


np.multiply только делает элемент умножением элемента. Вы хотите внешний продукт. Использовать np.outer:

np.outer(np.arccos(xxa), nd)

если вы хотите использовать numpy, подобный MATLAB, вы должны убедиться, что ваши массивы имеют правильную форму. Вы можете проверить форму любого массива numpy с arrayname.shape и потому что Ваш массив na имеет форму (4,) вместо (4,1), the transpose метод неэффективным и multiply вычисляет скалярное произведение. Использовать arrayname.reshape(N+1,1) респ. arrayname.reshape(1,N+1) для преобразования массивов.

import numpy as np
n = range(0,N+1)
pi = np.pi
xx = np.cos(np.multiply(pi / float(N), n))

xxa = np.asarray(xx).reshape(N+1,1)
na = np.asarray(n).reshape(N+1,1)
nd = np.transpose(na)

T = np.cos(np.multiply(np.arccos(xxa),nd))

начиная с Python 3.5 вы можете использовать @ оператор для умножения матриц. Так это ... walkover, чтобы получить более простой читаемый код, который очень похож на MATLAB.

import numpy as np
n = np.arange(N + 1).reshape(N + 1, 1)   
xx = np.cos(np.pi * n / N)
T = np.cos(np.arccos(xx) @ n.T)

здесь n.T обозначает транспонирование n.