【问题标题】:Apply a 1D array to every cell of a 2D array to create a 3D array将 1D 数组应用于 2D 数组的每个单元以创建 3D 数组
【发布时间】:2019-04-07 04:47:19
【问题描述】:

在 Numpy 中给定一个二维数组和一个一维数组:

a = np.array([[1,2,3],[4,5,6]])
b = np.array([2,4,6])

我想减去 a - b 但不是得到:

Out[16]: 
array([[-1, -2, -3],
   [ 2,  1,  0]])

我想要这个:

array([[[-1, -3, -5], [0, -2, -4], [1, -1, -3]],
       [[2, 0, -2], [3, 1, -1], [4, 2, 0]]])

如何进行矢量化(即没有 for 循环)以提高速度?

【问题讨论】:

    标签: python python-2.7 numpy vectorization array-broadcasting


    【解决方案1】:

    一个解决方案是

    a[...,np.newaxis]-b 
    

    这只是一个广播技巧。

    而不是减去

    >>> a
    array([[1, 2, 3],
           [4, 5, 6]])
    

    你从

    中减去
    >>> a[...,np.newaxis]
    array([[[1],
            [2],
            [3]],
    
           [[4],
            [5],
            [6]]])
    

    有形状

    >>> a[...,np.newaxis].shape
    (2, 3, 1)
    

    b 有形状

    >>> b.shape
    (3,)
    

    所以广播规则会给你一个你想要的形状(2,3,3)的输出。有很好的关于广播原理的资料here

    【讨论】:

    • 不错!完美运行!
    • 是否有一个等效的技巧来做相反的事情:假设把那个 3D 数组转换回一个 2D 数组,每个单元格都包含总数,所以:array([[-9, -6, - 3], [[0, 3, 6]])
    • 不确定我是否理解。如果您愿意,您可以发布另一个问题。我正在努力在 numpy 上做得更好
    • 答案是使用 np.sum(c, axis=2)
    • 我真正想做的就是将两者分开。所以 c = a[...,np.newaxis] - b 和 d = np.sum(c,axis=2)。那么我希望 e = c/d 标准化。但这不起作用。
    【解决方案2】:

    你想要outer减法

    >>> np.subtract.outer(a,b)
    
    array([[[-1, -3, -5],
            [ 0, -2, -4],
            [ 1, -1, -3]],
    
           [[ 2,  0, -2],
            [ 3,  1, -1],
            [ 4,  2,  0]]])
    

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 2017-09-11
      • 2013-08-21
      相关资源
      最近更新 更多