Умножение Python различной формы на продукт с точечными точками - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь понять оператор умножения python. Я всегда исходил из предположения, что он выполнил точечное произведение при выполнении следующих

a * b

, однако приведенный ниже пример показывает, что производятся разные формы.

a = np.random.random((3, 3))
b = np.array([1,0,1])

Оператор умножения:

(a*b).shape
(3, 3)

Произведение с числом точек:

np.dot(a,b).shape
(3,)

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

Ответы [ 2 ]

3 голосов
/ 23 октября 2019
import numpy as np
a = np.random.randint(3, size=(3, 3))

Out[1]:

(A)  [[0 1 1]
      [0 2 2]
      [0 1 0]]

b = np.array([1,0,2]) 

Out[2]:

(B)  [1 0 2]

Таким образом, в операции a * b происходит поэлементное умножение. Из-за несоответствия размеров происходит «широковещание» и применяется экстраполированное «b» вместо реального «b».

(A)[[0 1 1]   (B)[[1 0 2]     [[0 0 2]   # [0x0, 1x0, 1x2] and so on
    [0 2 2]   *   [1 0 2]   =  [0 0 4]
    [0 1 0]]      [1 0 2]]     [0 0 0]]

С другой стороны, np.dot дает вам умножение матрицы:

(A)[[0 1 1]   (B)[[1]     [[2]   # [0x1 + 1x0 + 1x2 = 2] and so on
    [0 2 2]   X   [0]   =  [4]
    [0 1 0]]      [2]]     [0]]
0 голосов
/ 23 октября 2019

Один общий ответ заключается в том, что оператор умножения python ведет себя по-разному в зависимости от объекта, к которому он применяется.

numpy объекты не примитивные типы Python. numpy переопределяет поведение оператора умножения.

Согласно numpy документации :

арифметические операторы для массивов применяются поэлементно

Читая документ, вы получите ответ:

В отличие от многих языков матриц, оператор продукта * работает поэлементно в массивах NumPy. Произведение матрицы может быть выполнено с помощью оператора @ (в python> = 3.5) или функции или метода точек

...