在公共列上查找两组Python Numpy数组
我正在尝试合并一些数据,我有以下两个2d numpy数组(a和b) 我想得到2个新的2d numpy阵列(c和d),其中a和b的第一列匹配如下在公共列上查找两组Python Numpy数组,python,arrays,numpy,merge,Python,Arrays,Numpy,Merge,我正在尝试合并一些数据,我有以下两个2d numpy数组(a和b) 我想得到2个新的2d numpy阵列(c和d),其中a和b的第一列匹配如下 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.2
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])
谢谢我希望这是一个非常快速的解决方案,特别是在预分类数据上
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)
这是一个1000倍大的无序阵列上的小规模比较
Full tests done 1,000 times
while_loop_method = 24.1850584226
hash_map_method = 25.9077035996
我的方法似乎可以很好地扩展,但在未排序的大型阵列上,它的效率并不高。我希望我的加入是罪魁祸首。看起来很有趣,但你试过什么?(我们喜欢在这里鼓励学习并阻止懒惰;-)到目前为止,没有太多,只是每个项目上的一个简单循环,然而,正如你可以想象的那样,它非常缓慢……那么就把它放到问题上吧,不要害羞。(我在强调差异,为什么不在我们达成目标的同时扩大目标)。是的,我可以扩大目标,但我认为这不相关。我相信这个问题是不言自明的:)这里可能有改进的余地,但是这种方法应该对你的目标非常有效。谢谢,我会尝试一下,我猜你的比较是和我的hash-map方法对吧?确实如此。您可以进行优化,使两个空np.array与“a”或“b”一样大,以较小者为准。然后,您可以简单地通过索引将每个值添加到预制数组中,而不是连续追加。作为最后一步,您将删除未使用的索引。应该注意的是,第1列中的重复值是未定义的行为……如果需要,您可能需要使用特殊的逻辑来处理它。
Full tests done 100,000 times
while_loop_method = 3.19426544412 sec
hash_map_method = 3.89232874699 sec
Full tests done 1,000 times
while_loop_method = 24.1850584226
hash_map_method = 25.9077035996