【问题标题】:effectively comparing two arrays of different size有效地比较两个不同大小的数组
【发布时间】:2017-02-09 11:06:10
【问题描述】:

我有两个数组(datafinal),我想比较两个数组并返回(outdata 中不在final 中的元素

数据:

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 次(该示例只是万分之一),因此速度是我主要关心的问题。

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

【问题讨论】:

  • @Divakar,np.ravel_multi_index 适用于整数。如果我的数据是 float64 类型怎么办
  • 在你的实际情况下你有多少列?
  • @Divakar,finaldata 都有 3 列
  • 尝试使用 set() 及其微分函数
  • 是否保证最终的所有行都在数据中?

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


【解决方案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)

如果您想在比较这些浮点值时考虑一些容差,您可能希望在idx 步骤中使用np.isclose() 而不是==

示例运行 -

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]])

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多