【问题标题】:Find Two Sets of Python Numpy Arrays on Common Column在公共列上查找两组 Python Numpy 数组
【发布时间】:2015-05-31 16:01:09
【问题描述】:

我正在尝试合并一些数据,我有以下两个 2d numpy 数组(ab

a = [[  10   9.689474368e-04][  20   6.88780375e-04]
     [  30   4.296339997e-04][  40  -1.06232578e-03]
     [  50  -1.219884414e-03][  60  -1.27936723e-03]]

b = [[  30   6.687897368e-04][  40   2.887890375e-04]
     [  50   3.293467897e-04][  60  -8.067893578e-03]
     [  70  -7.213988414e-03][  80  -8.278967323e-03]]

我想获得 2 个新的 2d numpy 数组(cd),其中 ab 的第一个列 匹配如下;

c = [[  30   4.296339997e-04][  40  -1.06232578e-03]
     [  50  -1.219884414e-03][  60  -1.27936723e-03]]

d = [[  30   6.687897368e-04][  40   2.887890375e-04]
     [  50   3.293467897e-04][  60  -8.067893578e-03]]

有人知道这样做的优化方法吗?

我尝试过对每个项目进行简单的循环,但是速度不够快,我知道可以通过更优雅的方法来解决它。

我正在使用以下解决方案。它快得多,但不确定它是否是正确的方法。

aHash = map(tuple, a)
bHash = map(tuple, b)

aKey = {x[:1] for x in aHash}
bKey = {x[:1] for x in bHash}

c = np.array([x for x in bHash if x[:1] in aKey])
d = np.array([x for x in aHash if x[:1] in bKey])

谢谢

【问题讨论】:

  • 看起来很有趣,但是您尝试过什么? (我们喜欢在这里鼓励学习并阻止懒惰;-)
  • 到目前为止不多,只是每个项目上的一个简单循环,但是您可以想象它非常慢.....
  • 那么,不要害羞。 (我正在寻找差异,你为什么不扩展我们的目标是什么)。
  • 是的,我可以扩展目标,但我认为这无关紧要。我相信这个问题是不言自明的:)

标签: python arrays numpy merge


【解决方案1】:

这是一个我希望很快的解决方案,尤其是在预排序的数据上。

import numpy as np

a = np.array([[  20  ,6.88780375e-04],
     [  30 ,  4.296339997e-04],[  40 , -1.06232578e-03],
     [  50  ,-1.219884414e-03],[  60 , -1.27936723e-03],[  10  ,9.689474368e-04],])

b = np.array([[  30 ,  6.687897368e-04],[  40  , 2.887890375e-04],
     [  50 ,  3.293467897e-04],[  60 , -8.067893578e-03],
     [  70 , -7.213988414e-03],[  80 , -8.278967323e-03],])

a.sort(axis=0)
b.sort(axis=0)

def merge(a, b):
    c = []
    d = []
    ai = 0
    bi = 0
    while(ai < len(a) and bi < len(b)):
        av = a[ai]
        bv = b[bi]
        if av[0] == bv[0]:
            c.append(av)
            d.append(bv)
            ai += 1
            continue
        if av[0] < bv[0]:
            ai += 1
            continue
        else:
            bi += 1
            continue

    return np.array(c), np.array(d)


print merge(a,b)

这是与当前发布的唯一其他方法的比较。这使用了稍微未排序的原始数组(我想对排序方法施加一些惩罚)

Full tests done 100,000 times
while_loop_method = 3.19426544412 sec
hash_map_method = 3.89232874699 sec

这是对大 1000 倍的混洗数组进行的小规模比较。

Full tests done 1,000 times
while_loop_method = 24.1850584226
hash_map_method = 25.9077035996

我的方法似乎可以很好地扩展,但在未排序的大型数组上效率几乎没有。我希望我添加到列表中是罪魁祸首。

【讨论】:

  • 这里可能还有改进的余地,但是这种方法应该对您的目标非常有效。
  • 谢谢,我试试看,我猜你的比较是和我的哈希映射方法对吧?
  • 确实如此。您可以进行的优化是使 2 个空 np.arrays 与“a”或“b”一样大,以较小者为准。然后,您可以简单地通过索引将每个值添加到预制数组中,而不是连续追加。作为最后一步,您将删除未使用的索引。应该注意的是 col 1 中的重复值是未定义的行为......如果需要,您可能需要制定特殊的逻辑来处理它。
猜你喜欢
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 2015-09-22
  • 2013-02-18
  • 1970-01-01
  • 2017-05-05
  • 2017-01-22
相关资源
最近更新 更多