умножение вектора матрицы numpy [дубликат]
этот вопрос уже есть ответ здесь:
как отличается умножение для классов numpy Matrix vs Array?
7 ответов
когда я умножаю два массива numpy размеров(n x n)*(n x 1), я получаю матрицу размера (n x n). Следуя обычным правилам умножения матриц, ожидается вектор (n x 1), но я просто не могу найти его информация о том, как это делается в модуле numpy Python.
дело в том, что я не хочу реализовывать его вручную, чтобы сохранить скорость программы.
пример кода показан ниже:
a = np.array([[ 5, 1 ,3], [ 1, 1 ,1], [ 1, 2 ,1]])
b = np.array([1, 2, 3])
print a*b
>>
[[5 2 9]
[1 2 3]
[1 4 3]]
то, что я хочу:
print a*b
>>
[16 6 8]
1 ответ:
простое решение
использовать
numpy.dotилиa.dot(b). Смотрите документацию здесь.>>> a = np.array([[ 5, 1 ,3], [ 1, 1 ,1], [ 1, 2 ,1]]) >>> b = np.array([1, 2, 3]) >>> print a.dot(b) array([16, 6, 8])это происходит потому, что массивы numpy не являются матрицами, а стандартные операции
*, +, -, /работа по элементам на массивах. Вместо этого вы можете попробовать использоватьnumpy.matrixи*будет рассматриваться как умножение матриц.
Других Решений
также знаю, что есть другие опции:
как указано ниже, при использовании python3. 5+ The
@оператор работает так, как вы ожидали:>>> print(a @ b) array([16, 6, 8])если вы хотите, перебор, вы можете использовать
numpy.einsum. Документация даст вам вкус к тому, как это работает, но, честно говоря, я не совсем понял, как его использовать, пока не прочитал ответ и просто играю с ним сам по себе.>>> np.einsum('ji,i->j', a, b) array([16, 6, 8])по состоянию на середина 2016 года (numpy 1.10.1), вы можете попробовать экспериментальный
numpy.matmul, который работаетnumpy.dotС двумя основными исключениями: нет скалярного умножения, но он работает со стеками матриц.>>> np.matmul(a, b) array([16, 6, 8])
numpy.innerфункционирует так же, как иnumpy.dotдля умножения матриц-векторов, но ведет себя по-разному для матрицы-матричного и тензорного умножения (см. Википедию о различиях между внутренний продукта и скалярное произведение в целом и смотрите это так ответ относительно реализаций numpy).>>> np.inner(a, b) array([16, 6, 8]) # Beware using for matrix-matrix multiplication though! >>> b = a.T >>> np.dot(a, b) array([[35, 9, 10], [ 9, 3, 4], [10, 4, 6]]) >>> np.inner(a, b) array([[29, 12, 19], [ 7, 4, 5], [ 8, 5, 6]])
более редкие варианты для крайних случаев
если у вас есть тензоры (массивы размерности больше или равен единице), вы можете использовать
numpy.tensordotС необязательным аргументомaxes=1:>>> np.tensordot(a, b, axes=1) array([16, 6, 8])не используйте
numpy.vdotесли у вас есть матрица комплексных чисел, так как матрица будет сглажена до 1D массива, то она попытается найти комплексное сопряженное точечное произведение между вашей сглаженной матрицей и вектором (что не удастся из-за несоответствия размераn*mvsn).
Comments