1

numpy.ndarray 型の次元 (n x 1) の 3 つの配列があり、 amplitudedistanceおよびweightという名前が付けられています。それぞれの距離重みの値に基づいて、振幅配列の選択されたエントリを使用したいと思います。たとえば、特定の距離範囲内のエントリのインデックスを見つけたいので、次のように書きます。

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

次に、 の値を使用して続行しますamplitude(index)。条件を指定するために 1 つの配列のみを使用する限り、これは完全に機能します。たとえば試してみると

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 x 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 に答える