使用2d numpy数组广播1d numpy数组

时间:2017-02-01 20:37:10

标签: python python-2.7 numpy numpy-broadcasting

这可能是一个非常简单的问题,但我并没有想到这一点。

我有一个2D numpy数组,其形状为(3,2),形状为1D数组(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的轴(因为其他数组是否为此形状)。

你们能帮助我吗?

1 个答案:

答案 0 :(得分: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,则需要谨慎使用此方法。