2017-03-22 37 views
0

給定兩個具有相同長度的numpy數組,我需要從兩個數組中刪除那些相同的索引元素爲零。例如,給定我需要獲得從兩個數組中刪除具有相同索引的零元素

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

創建複合的面具和索引 -

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

替代的方式來創建蒙 -

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

如果你看中了內置插件,這些將轉化 -

~np.logical_and(a==0, b==0) 
np.logical_or(a!=0, b!=0) 

比較掩碼創建代碼的運行時測試 -

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 

沒有看到任何明確的贏家。如果你要挑剔,那麼得到其中一個OR-ing爲基礎的。

+0

偉大的答案Divakar!你知道這些方法是否明顯比其他方法快嗎? – Gabriel

相關問題