给定两个具有相同长度的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]
但是这也删除了那两个数组中零的元素,而不是只删除两个元素都为零的元素。
我的实际数组有数百万个元素,所以我采用了最有效的方法。
答案 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
的。