Python 将不同形状乘以 numpy 点积

Python Multiplication different shape to numpy dot product

我正在尝试理解 python 乘法运算符。我一直假设它在执行以下操作时执行点积

a * b

然而,下面的例子表明产生了不同的形状。

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

乘法运算符:

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

Numpy 点积:

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

乘法运算符在做什么数学运算?

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 运算中,它进行逐元素乘法。因为尺寸不匹配,所以 "broadcast",并应用外推的 "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]]

一个普遍的答案是 python 乘法运算符根据其应用的对象有不同的行为。

numpy 对象是 不是 python 原始类型。 numpy 重新定义了乘法运算符的行为。

根据numpydocumentation

arithmetic operators on arrays apply elementwise

进一步阅读文档您会得到答案:

Unlike in many matrix languages, the product operator * operates elementwise in NumPy arrays. The matrix product can be performed using the @ operator (in python >=3.5) or the dot function or method