【问题标题】:Numpy dot over of shapes (2,) (3,1) gives error but multiplication doesn't形状 (2,) (3,1) 的 Numpy 点会给出错误,但乘法不会
【发布时间】:2017-06-18 18:39:27
【问题描述】:

我正在寻找关于广播规则和 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) 

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

【问题讨论】:

  • broadcasting 规则不适用于dot
  • 您希望dot 对 2 个一维数组做什么?还是用 2 扩展为 2d?内积?外面?
  • @hpaulj 我正在研究的方程 δ=W f(h) 试图获得内积。最后是一个标量值。所以我正在努力使用 np.dot 方法而不是 numpy 乘法,以便更好地理解以及我应该在哪里使用 np.dot 和 numpy 乘法。对此有何建议/经验?谢谢,在广播文档中没有发现 np.dot 不适用于他们。
  • ' 在数学中,点积或标量积是一种代数运算,它采用两个等长的数字序列(通常是坐标向量)并返回一个数字' - 来自 wiki。请注意equal-length 规范。

标签: python numpy matrix-multiplication


【解决方案1】:

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

当对两个数组进行操作时,NumPy 会逐元素比较它们的形状。它从尾随维度开始,然后向前推进。两个维度兼容时

  1. 它们是相等的,或者
  2. 其中一个是 1

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

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 2019-06-13
    • 2020-04-16
    • 2013-08-17
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多