実際には、次のことを行う方が簡単で効率的な特別なケースがあります。
データを作成します。
>>> arr
array([[[ 6, 9, 4],
[ 5, 2, 1],
[10, 15, 30]],
[[ 9, 0, 1],
[ 4, 6, 4],
[ 8, 3, 9]],
[[ 6, 7, 4],
[ 0, 1, 6],
[ 4, 0, 1]]])
期待値:
>>> index_pos = np.where((arr[:,:,0]==10) & (arr[:,:,1]==15) & (arr[:,:,2]==30))
>>> index_pos
(array([0]), array([2]))
ブロードキャストを使用して、これを同時に行います。
>>> arr == np.array([10,15,30])
array([[[False, False, False],
[False, False, False],
[ True, True, True]],
[[False, False, False],
[False, False, False],
[False, False, False]],
[[False, False, False],
[False, False, False],
[False, False, False]]], dtype=bool)
>>> np.where( np.all(arr == np.array([10,15,30]), axis=-1) )
(array([0]), array([2]))
必要なインデックスが連続していない場合は、次のようにすることができます。
ind_vals = np.array([0,2])
where_mask = (arr[:,:,ind_vals] == values)
できたら放送してください。
@Jamie のコメントに刺激されて、考慮すべき興味深い点がいくつかあります。
arr = np.random.randint(0,100,(5000,5000,3))
%timeit np.all(arr == np.array([10,15,30]), axis=-1)
1 loops, best of 3: 614 ms per loop
%timeit ((arr[:,:,0]==10) & (arr[:,:,1]==15) & (arr[:,:,2]==30))
1 loops, best of 3: 217 ms per loop
%timeit tmp = (arr == np.array([10,15,30])); (tmp[:,:,0] & tmp[:,:,1] & tmp[:,:,2])
1 loops, best of 3: 368 ms per loop
質問は、なぜこれなのか?:
最初に調べる:
%timeit (arr[:,:,0]==10)
10 loops, best of 3: 51.2 ms per loop
%timeit (arr == np.array([10,15,30]))
1 loops, best of 3: 300 ms per loop
arr == np.array([10,15,30])
最悪の場合は の 1/3 の速度になると予想されarr[:,:,0]==10
ます。なぜこれが当てはまらないのか、誰にも分かりますか?
次に、最終的な軸を組み合わせるときに、これを達成する方法はたくさんあります。
tmp = (arr == np.array([10,15,30]))
method1 = np.all(tmp,axis=-1)
method2 = (tmp[:,:,0] & tmp[:,:,1] & tmp[:,:,2])
method3 = np.einsum('ij,ij,ij->ij',tmp[:,:,0] , tmp[:,:,1] , tmp[:,:,2])
np.allclose(method1,method2)
True
np.allclose(method1,method3)
True
%timeit np.all(tmp,axis=-1)
1 loops, best of 3: 318 ms per loop
%timeit (tmp[:,:,0] & tmp[:,:,1] & tmp[:,:,2])
10 loops, best of 3: 68.2 ms per loop
%timeit np.einsum('ij,ij,ij->ij',tmp[:,:,0] , tmp[:,:,1] , tmp[:,:,2])
10 loops, best of 3: 38 ms per loop
einsum の高速化は別の場所all
で明確に定義されていますが、と連続した の間にこのような違いがあるのは奇妙に思え&
ます。