【问题标题】:elementwise operation actually performs matrix operation [duplicate]逐元素运算实际上执行矩阵运算[重复]
【发布时间】:2021-06-21 16:26:19
【问题描述】:

假设您有两个(或更多)numpyndarrays 或等于 size(意味着它们具有相同数量的元素),例如:

A = np.array([[1],[2],[3]]) #Define a 3-element column vector
B = np.array([1,2,3]) #Define a 3-element row vector

鉴于 numpy 的文档将 * 和 / 运算符宣传为两个 ndarray 类型之间的“元素方式”,为什么要执行以下操作:

AtimesB = A*B
AoverB = A/B

返回:

array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]]) #AtimesB
array([[1.        , 0.5       , 0.33333333],
       [2.        , 1.        , 0.66666667],
       [3.        , 1.5       , 1.        ]]) #AoverB

代替:

array([1,4,9])
array([1,1,1])

据我所知,@ 运算符用于进行矩阵乘法,np.divide 处理矩阵除法。我在这里想念什么?这是numpy 处理数组shapes 歧义的方式吗?

【问题讨论】:

  • numpy 没有行(列)向量的概念。一维数组表示线性代数中的行向量和列向量。在您的情况下,您的“列向量”是 2d,“行向量”是 1d。由于numpy broadcasting,* 和 / 给出矩阵运算。
  • 我认为这个操作的技术术语是两个向量的“外积”。也可以使用np.outer 完成。昨天有人在this answer 中解释了广播的工作原理。
  • shape 提供的信息比size 多。 element-wise 操作不仅仅是元素的数量。一个数组是 (3,1) 形状,另一个是 (3,)。对于广播目的,(3,) 等价于 (1,3)。一起得到一个 (3,3),一个“外部”操作。

标签: python arrays numpy


【解决方案1】:

np.divide 实际上是用于元素明智的划分。仅当数组具有相同的形状(而不是大小)时,才使用 * 或 / 进行元素明智的操作。否则,如果可能,数组为broadcasted。 为了保证元素明智的乘法,你可以使用np.multiply。

【讨论】:

    【解决方案2】:

    A 也必须是一行才能得到您期望的结果!

    >>> A
    array([[1],
           [2],
           [3]])
    >>> A.T
    array([[1, 2, 3]])
    >>> A.T * B
    array([[1, 4, 9]])
    >>> A.T / B
    array([[1., 1., 1.]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 2012-01-27
      • 2017-10-29
      • 2019-10-04
      相关资源
      最近更新 更多