Умножение векторов столбцов и строк в 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.