【问题标题】:Dot product with shapes (x) and (x, y)形状为 (x) 和 (x, y) 的点积
【发布时间】:2015-11-15 19:13:52
【问题描述】:

我对 numpy 真的很陌生,所以我在理解点积时遇到了一些麻烦。

我有这段简单的代码:

import numpy as np

A = np.ones((5))
B = np.ones((5,10))

A.dot(B)
# array([ 5.,  5.,  5.,  5.,  5.,  5.,  5.,  5.,  5.,  5.])

A.dot(B).shape
# (10,)

我无法理解这段代码中发生了什么。我有点迷茫,因为(10,)的形状好像不是列向量,因为转置是一样的。

A被广播了吗?我认为A应该被广播成(5,5)的形状,所以它可以与B相乘,从而返回一个形状为(5,10)的数组。我怎么了?

【问题讨论】:

  • Numpy 将转置定义为news shape = reversed(old_shape),对于shape=(5,) 没有任何反应。列向量需要 shape=(5, 1)
  • 所以基本上 np.ones((5)) 被视为 np.ones((1,5)) 但没有嵌套列表
  • 是的,例如 [1., 1., 1., 1., 1.] dot([[1., 1., 1., 1., 1., 1., 1. ,,,,],
  • 我们只是说 numpy 在 1 维数组和具有一列又名向量的 2d 矩阵之间产生了差异

标签: python numpy dot-product


【解决方案1】:

Numpy 对一维数组(形状 (N,))和一列(形状 (N, 1))或一行(形状 (1, N) 又名列向量或行向量)的二维数组(矩阵)产生了影响。

>>> a = np.ones((5, 1))
>>> B = np.ones((5, 5))
>>> B.dot(a)
array([[ 5.],
       [ 5.],
       [ 5.],
       [ 5.],
       [ 5.]])

或者使用 numpy 1.10 取消 python 3.5:

>>> a = np.ones((5, 1))
>>> B = np.ones((5, 5))
>>> B @ a
array([[ 5.],
       [ 5.],
       [ 5.],
       [ 5.],
       [ 5.]])

如果你有一个一维数组,你可以使用np.newaxis 使其成为行或列向量:

>>> a = np.ones(5)
>>> B = np.ones((5, 5))
>>> B @ a[:, np.newaxis]
array([[ 5.],
       [ 5.],
       [ 5.],
       [ 5.],
       [ 5.]])

新行和新列:

>>> x = np.arange(5)
>>> B = x[:, np.newaxis] @ x[np.newaxis, :]
>>> B
array([[ 0,  0,  0,  0,  0],
       [ 0,  1,  2,  3,  4],
       [ 0,  2,  4,  6,  8],
       [ 0,  3,  6,  9, 12],
       [ 0,  4,  8, 12, 16]])

【讨论】:

    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多