形状 (2,) (3,1) 上的 Numpy 点会给出错误,但乘法不会

Numpy dot over of shapes (2,) (3,1) gives error but multiplication doesn't

我正在寻找有关广播规则和 numpy.dot 乘数方法的说明。我创建了两个形状 (2,) 和 (3,) 的数组,可以通过添加新轴(3,1 形状)来相乘,但即使添加新轴也不能通过 np.dot 方法并变成(3,1)形状。下面是完成的小测试。

x_1 = np.random.rand(2,) 
print(x_1)
x_2 = np.random.rand(3,)
print(x_2)
> [ 0.48362051  0.55892736]
> [ 0.16988562  0.09078386  0.04844093]

x_8 = np.dot(x_1, x_2[:, np.newaxis])
> ValueError: shapes (2,) and (3,1) not aligned: 2 (dim 0) != 3 (dim 0)

x_9 = x_1 * x_2[:, np.newaxis]
print(x_9)
> [[ 0.47231067  0.30899592]
  [ 0.17436521  0.11407352]
  [ 0.01312074  0.00858387]]

x__7 = x_1[:, np.newaxis] * x_2[:, np.newaxis]
> ValueError: operands could not be broadcast together with shapes (2,1) (3,1) 

我理解 np.dot of (2,1) & (1,3) 有效,但为什么 (2,1) & (3,1) 无效,因为第二条广播规则说,二维是当其中之一为 1 时兼容。因此,如果其维度之一为 1,则 np.dot 应该有效,或者我是否理解了第二条规则错误?还有为什么 X_9 有效(乘法)但 x_8(np.dot)无效,当两者的形状相同时。

np.dot 用于矩阵-矩阵乘法(其中列向量可以被视为具有一列的矩阵,行向量可以被视为具有一行的矩阵)。 *(乘法)在其中一个参数是标量的情况下用于标量乘法,否则为广播。所以广播规则不适用于np.dot。 x_9 有效是因为,正如这里的广播规则所述 https://docs.scipy.org/doc/numpy-1.12.0/user/basics.broadcasting.html

When operating on two arrays, NumPy compares their shapes element-wise. It starts with the trailing dimensions, and works its way forward. Two dimensions are compatible when

  1. they are equal, or
  2. one of them is 1

所以 x_1 的(唯一)维度(2)与 x_2 的最后一个维度(1,因为您添加了新维度)兼容,其余维度维度是 3。