用2d numpy数组广播1d numpy数组
这可能是一个非常简单的问题,但我没有想到这一点。
我有一个二维numpy数组,形状(3,2)和一维形状(3,)的一维数组:
A = [[2,4],[6,8][10,12]]
B = [1,2,4]
我想通过数组B分割数组A,结果是:
[[2,4],[3,4][2.5,3]]
但numpy不会让我这样做,我认为是因为形状不对。 我得到熟悉的'操作数不能与形状(10,2)(10,)'错误一起播出。
我尝试重塑和swapaxis,但它不起作用。 我更希望能够在没有for循环的情况下执行此操作(因为我需要使用大数组来执行此操作),而不必交换数组A的轴(因为其他数组是这种形状)。
你们能帮我吗?
将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
,则需要谨慎使用此方法。