我有两个数组(data
和final
),我想比较两个数组并返回out
data
中不在final
内的元素{1}}
数据:
x y z
10.2 15.2 25.2
15.2 17.2 40.2
12.2 13.2 5.2
14.2 14.2 34.2
12.2 12.2 56.2
13.2 17.2 32.2
11.2 13.2 21.2
最后:
x y z
15.2 17.2 40.2
14.2 14.2 34.2
12.2 12.2 56.2
出:
x y z
10.2 15.2 25.2
12.2 13.2 5.2
13.2 17.2 32.2
11.2 13.2 21.2
这就是我所做的,
out = [np.column_stack(data[k]) for k in range(len(data)) if data[k] not in final]
out = np.vstack(out)
问题
我遇到的问题是,我必须执行这个让我的out
大约10000次的动作(例子只是10000中的一个),因此速度是我的主要关注点。
有没有一种有效的方法来执行此操作?
答案 0 :(得分:1)
这是一种方法 -
def remrows(a, b): # remove rows from a based on b
ab = np.row_stack((a,b))
sidx = np.lexsort(ab.T)
ab_sorted = ab[sidx]
idx = np.flatnonzero((ab_sorted[1:] == ab_sorted[:-1]).all(1))
return np.delete(a, sidx[idx], axis=0)
如果您想在比较这些浮点值时考虑一些容差,您可能希望在np.isclose()
步骤中使用==
而不是idx
。
示例运行 -
In [222]: a = np.random.randint(111,999,(10,3)).astype(float)/10.0
In [223]: a
Out[223]:
array([[ 51.3, 66.3, 58.8],
[ 24.3, 40.6, 37.8],
[ 94.7, 28.8, 69.3],
[ 21.8, 48.3, 57.5],
[ 87.1, 81.9, 27.9],
[ 14.2, 36.4, 22.2],
[ 56.7, 58.7, 16.2],
[ 66.2, 99.1, 62.5],
[ 75.1, 27.8, 34.4],
[ 59.7, 73.8, 22.3]])
In [224]: b = a[[1,3,5]]
In [225]: remrows(a, b)
Out[225]:
array([[ 51.3, 66.3, 58.8],
[ 94.7, 28.8, 69.3],
[ 87.1, 81.9, 27.9],
[ 56.7, 58.7, 16.2],
[ 66.2, 99.1, 62.5],
[ 75.1, 27.8, 34.4],
[ 59.7, 73.8, 22.3]])