【问题标题】:numpy array multiplication issuenumpy数组乘法问题
【发布时间】:2012-11-08 19:48:43
【问题描述】:

假设我有三个数组(即numpy.array 类型):

>>> w.shape
(113,)
>>> X.shape
(113,1)
>>> Y.shape
(113,)

numpy 帮助页面建议在数组上每个乘法都是元素级的。由于上述三个向量在第一维中的大小均为 113,因此我认为在所有情况下乘法都会给出 113 长度的向量,但事实并非如此:

>>> (w * Y).shape     # expected
(113,)
>>> (w * X).shape     # ?!?!?!?!
(113,113)

第二个轴上的113是哪里来的?对我来说,它看起来并不那么明智。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    在对两个数组进行操作时,NumPy 会比较它们的形状 元素方面。它从尾随维度开始,并按其 前进的道路。当两个维度相等或一个维度时,它们是兼容的 其中有 1 个。

    两个轴中较小的一个被拉伸或“复制”以匹配 另一个。

    这里正在应用 Numpy 的 broadcasting 规则。

    w      (1d array):       113
    X      (2d array): 113 x   1   
    Result (2d array): 113 x 113
    

    【讨论】:

    • 啊哈,“从 trailing 维度开始”!谢谢。
    • 如果您想要x (N,)y (N,1) 相乘的(N,1) 结果,请使用x[:,None]*y 强制广播。
    【解决方案2】:

    查看发生了什么的最简单方法是通过示例:

    w = array([5,6])
    x = array([[1,2],[3,4]])
    z = array([[5,6]])
    
    w*x
    # array([[ 5, 12],
    #        [15, 24]])
    
    w*z
    # array([[25, 36]])
    

    【讨论】:

      猜你喜欢
      • 2011-03-13
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多