2017-03-22 42 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

相关问题