有效地比较两个不同大小的阵列

时间:2017-02-09 11:06:11

标签: python performance python-3.x numpy vectorization

我有两个数组(datafinal),我想比较两个数组并返回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中的一个),因此速度是我的主要关注点。

有没有一种有效的方法来执行此操作?

1 个答案:

答案 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]])
相关问题