Сбой умножения матрицы («не выровненные фигуры»), когда вторым элементом является вектор / массив - PullRequest
0 голосов
/ 17 сентября 2018

Когда я умножаю числовую матрицу NxN на числовой массив N элементов, я получаю сообщение об ошибке, говорящее о том, что фигуры не выровнены.

from numpy import matrix,ones,eye
A = matrix(eye(3))
b = ones(3)
A*b

ValueError: shapes (3,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)

Кроме того, перенос вектора не решает проблему.

A*b.T

ValueError: shapes (3,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)

Это имеет смысл, поскольку numpy не различает векторы столбцов и строк, поэтому bT равно b.

Как выполнить простое умножение матрицы на вектор?

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Проблема возникает из-за того, что оператор '*' выполняет поэлементное умножение, а НЕ матричное умножение, как вы намерены. В Python 3 это может быть сделано с помощью оператора '@', как предлагает w-m. В Python 2, однако, вы должны использовать.

import numpy as np
result = np.dot(A,b)

Оператор '*' попытается умножить каждый элемент A на соответствующий элемент b. Если они не одинаковой формы, вы получите ошибку, которую вы видите.

РЕДАКТИРОВАТЬ: Я неправильно понял вопрос OP. '*' будет работать для умножения матриц, если оба объекта являются матрицами . Тем не менее, np.ones (3) создает массив NumPy, который не является объектом матрицы NUMPY, поэтому он не работает и пытается выполнить поэлементное умножение.

если b становится:

b = np.matrix((1,1,1)).T

тогда код будет работать. Также следует отметить, что np.dot (A, b) будет работать, даже если A и b являются матричными объектами, массивами или их комбинацией, что делает его наиболее общим решением.

0 голосов
/ 17 сентября 2018

Поскольку A является матрицей, Python вызывает метод A __mul__ для вычисления A*b с b в качестве аргумента.То есть он вызывает A.__mul__(b).Numpy matrix настаивает на том, чтобы сделать все 2-мерной матрицей, поэтому он преобразует b в matrix перед выполнением умножения матрицы.Когда b преобразуется в пустую матрицу, результат имеет форму (1, 3):

In [248]: b
Out[248]: array([1., 1., 1.])

In [249]: np.matrix(b).shape
Out[249]: (1, 3)

Тогда __mul__ жалуется, что формы не выровнены, потому что A имеет форму (3, 3) ипреобразованный b имеет форму (1, 3).

Один из способов исправить это - убедиться, что b является двумерным с формой (3, 1) перед выполнением умножения:

In [250]: b = ones((3, 1))

In [251]: A * b
Out[251]: 
matrix([[1.],
        [1.],
        [1.]])

В долгосрочной перспективе, однако, было бы лучше изменить ваш код так, чтобы он вообще не использовал matrix, как упомянуто @wm.

0 голосов
/ 17 сентября 2018

(Не используйте np.matrix, это устарело . Вместо этого просто используйте 2D-массивы для линейной алгебры.)

Используйте оператор умножения матриц @:

In [177]: from numpy import ones,eye
     ...: A = eye(3)
     ...: b = ones(3)
     ...: A @ b
Out[177]: array([1., 1., 1.])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...