1

我有三个类型为 numpy.ndarray 的数组,尺寸为(n 乘 1),分别命名为 幅值距离重量。我想使用振幅数组的选定条目,基于它们各自的距离重量值。例如,我想在某个距离范围内找到条目的索引,所以我写:

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

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

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

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

4

1 回答 1

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乘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
于 2012-10-09T00:15:33.207 回答