В чем разница между операторами "numpy.dot ()", "*" и "@" при работе с массивами numpy? - PullRequest
0 голосов
/ 16 апреля 2019

Я хочу решить уравнения x + 6y − z = 0, x + 2y − 2z = 1, −5x + 2z = 8, используя python. Я пытался использовать разные операции умножения для умножения матриц, и ответ был разным, когда использовались разные операции умножения. Я хочу знать причину этого.

import numpy as np

a= np.array([[2,6,-1],[1,2,-2],[-5,0,2]])
b= np.array([0,1,8])
a_inv= np.linalg.inv(a)
#case1
c= np.dot(a_inv,b)
print(c.shape)
#case2
print((a_inv@b).shape)
#case3
print((a_inv*b).shape)

case1 и case2 дают правильный вывод, а case3 - нет. Выходы: Случай 1: (3,) Вариант 2: (3,) Вопрос 3: (3, 3)

1 Ответ

1 голос
/ 16 апреля 2019

Оператор * в numpy отличается от умножения матриц.Когда вы делаете a_inv * b (в вашем случае), вы создаете массив 3x3 следующим образом:

[[a[0,0] * b[0], a[0,1] * b[0], a[0,2] * b[0]],
 [a[1,0] * b[1], a[1,1] * b[1] ...]] #etc.

Помимо dot вы можете выполнять умножение матриц с помощью np.matmul(a_inv, b), или вы можете явно указатьNumpy, что ваши массивы являются матрицами с помощью np.matrix:

a_inv = np.matrix(a_inv)
b = np.matrix(b).T   # note that b will be a row vector, so you need to transpose it to make it a column vector
a_inv * b   #now numpy will interpret '*' as matrix multiplication
>>[[-2. ]
 [ 0.5]
 [-1. ]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...