Numpy.where:来自两个不同阵列的条件非常慢

时间:2012-10-08 23:12:17

标签: python numpy where

我有三个类型为numpy.ndarray的数组,其维度为(n乘1),名为幅度距离权重。我想根据各自的距离 - 和权重 - 值,使用幅度数组的选定条目。例如,我想在一定距离范围内找到条目的索引,所以我写道:

index = np.where( (distance<10) & (distance>=5) )

然后我将继续使用amplitude(index)中的值。 只要我只使用一个数组来指定条件,这就可以很好地工作。当我尝试例如

index = np.where( (distance<10) & (distance>=5) & (weight>0.8) )

操作变得超慢。为什么会这样,有没有更好的方法来完成这项任务?事实上,我最终想要使用6种不同数组之类的许多条件。

1 个答案:

答案 0 :(得分:1)

这只是一个猜测,但也许numpy正在播放你的数组?如果数组的形状完全相同,那么numpy将不会广播它们:

>>> distance = numpy.arange(5) > 2
>>> weight = numpy.arange(5) < 4
>>> distance.shape, weight.shape
((5,), (5,))
>>> distance & weight
array([False, False, False,  True, False], dtype=bool)

但如果他们有不同的形状,并且形状是可播放的,那么它会。 (n,)(n, 1)(1, n)都可以称为“n by 1”数组,它们并非完全相同:

>>> distance[None,:].shape, weight[:,None].shape
((1, 5), (5, 1))
>>> distance[None,:]
array([[False, False, False,  True,  True]], dtype=bool)
>>> weight[:,None]
array([[ True],
       [ True],
       [ True],
       [ True],
       [False]], dtype=bool)
>>> distance[None,:] & weight[:,None]
array([[False, False, False,  True,  True],
       [False, False, False,  True,  True],
       [False, False, False,  True,  True],
       [False, False, False,  True,  True],
       [False, False, False, False, False]], dtype=bool)

除了返回不需要的结果之外,如果阵列甚至是中等大小,这可能会导致大幅减速:

>>> distance = numpy.arange(5000) > 500
>>> weight = numpy.arange(5000) < 4500
>>> %timeit distance & weight
100000 loops, best of 3: 8.17 us per loop
>>> %timeit distance[:,None] & weight[None,:]
10 loops, best of 3: 48.6 ms per loop