2017-03-22 10 views
0

同じ長さの2つのnumpy配列が与えられている場合、それらの両方から0の同じインデックス要素を削除する必要があります。例えば、私は2つの配列から同じインデックスを持つゼロ要素を削除する

a = [5 9 2 0 1 4 9 8 1] 
b = [1 0 3 1 2 4 2 3 2] 

すなわちを得ることが必要と思いアレイ

a = [5 9 2 0 1 4 9 0 8 1] 
b = [1 0 3 1 2 4 2 0 3 2] 

与えられ、両方の配列ゼロ値を有していた唯一の要素は、両方の配列からを除去しました。私は、このアプローチ

import numpy as np 

a = np.random.randint(0, 10, 10) 
b = np.random.randint(0, 10, 10) 

a_z_idx = [a != 0] 
b_z_idx = [b != 0] 

ab_z_idx = a_z_idx and b_z_idx 

a = a[ab_z_idx] 
b = b[ab_z_idx] 

を試してみたが、これはまただけでなく、それらの両方の中にゼロである要素を削除するの、いずれかの配列にゼロであるそれらの要素を削除します。

私の実際の配列は数百万の要素を持っていますので、私は可能な限り効率的な方法をとっています。

答えて

4

組み合わせたマスクとインデックス作成 -

~np.logical_and(a==0, b==0) 
np.logical_or(a!=0, b!=0) 
- あなたはビルトインを空想した場合、それらはに翻訳します

mask = (a!=0) | (b!=0) 

- マスクを作成するための

mask = ~((a == 0) & (b==0)) 
a,b = a[mask], b[mask] 

代替方法を

マスク作成コードを比較するランタイムテスト -

In [342]: a = np.random.randint(0,10,(100000)) 

In [343]: b = np.random.randint(0,10,(100000)) 

In [344]: %timeit ~((a == 0) & (b==0)) 
    ...: %timeit (a!=0) | (b!=0) 
    ...: %timeit ~np.logical_and(a==0, b==0) 
    ...: %timeit np.logical_or(a!=0, b!=0) 
    ...: 
10000 loops, best of 3: 67.7 µs per loop 
10000 loops, best of 3: 62.8 µs per loop 
10000 loops, best of 3: 68.4 µs per loop 
10000 loops, best of 3: 62.8 µs per loop 

明確な優勝者は見つかりませんでした。あなたがかわいそうになる場合は、そのうちの1つをOR-ingに基づいて取得してください。

+0

すばらしい答えDivakar!これらの方法のいずれかが他の方法より顕著に速いかどうか知っていますか? – Gabriel

関連する問題