【问题标题】:Broadcasting a 1d numpy array with a 2d numpy array使用 2d numpy 数组广播 1d numpy 数组
【发布时间】:2017-06-18 18:15:51
【问题描述】:

这可能是一个非常简单的问题,但我没有弄清楚。

我有一个形状为 (3,2) 的二维 numpy 数组和一个形状为 (3,) 的一维数组:

    A = [[2,4],[6,8][10,12]]
    B = [1,2,4]

我想将数组 A 除以数组 B,得到:

   [[2,4],[3,4][2.5,3]]

但 numpy 不会让我这样做,我认为是因为形状不对。我得到熟悉的“操作数无法与形状 (10,2) (10,) 一起广播”错误。

我尝试了 reshape 和 swapaxis,但它不起作用。我更希望能够在没有 for 循环的情况下执行此操作(因为我需要对大型数组多次执行此操作)并且不必交换数组 A 的轴(因为其他数组是这种形状)。

你们能帮帮我吗?

【问题讨论】:

  • 你试过np.reshape([1,2,4], (3,1))吗? (10,) 数组可以广播到 (1,10) 和 (2,10)。但是在另一端添加维度需要您采取明确的行动。

标签: python python-2.7 numpy array-broadcasting


【解决方案1】:

B扩展为2D然后除-

A/B[:,None].astype(float)

示例运行 -

In [9]: A
Out[9]: 
array([[ 2,  4],
       [ 6,  8],
       [10, 12]])

In [10]: B
Out[10]: array([1, 2, 4])

In [11]: A/B[:,None].astype(float)
Out[11]: 
array([[ 2. ,  4. ],
       [ 3. ,  4. ],
       [ 2.5,  3. ]])

或者使用 from __future__ import division 来处理除法以产生一个浮动的 pt 数组 -

In [14]: from __future__ import division

In [15]: A/B[:,None]
Out[15]: 
array([[ 2. ,  4. ],
       [ 3. ,  4. ],
       [ 2.5,  3. ]])

通过倒数乘法提高性能 -

In [32]: A = np.random.rand(300,200)

In [33]: B = np.random.rand(300)

In [34]: from __future__ import division

In [35]: %timeit A/B[:,None]
1000 loops, best of 3: 336 µs per loop

In [36]: %timeit A*(1.0/B[:,None])
10000 loops, best of 3: 101 µs per loop

更多信息请访问here。此外,如果B 的值非常接近0,则需要小心使用这种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多