これは単なる推測ですが、おそらく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