从两个数组

时间:2017-03-22 20:23:05

标签: python arrays performance numpy

给定两个具有相同长度的numpy数组,我需要从它们两个中删除那些为零的相同索引元素。例如,给定数组

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

我需要获得

a = [5 9 2 0 1 4 9 8 1]
b = [1 0 3 1 2 4 2 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]

但是这也删除了那两个数组中零的元素,而不是只删除两个元素都为零的元素。

我的实际数组有数百万个元素,所以我采用了最有效的方法。

1 个答案:

答案 0 :(得分: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的。