找到另一个2D数组中二维数组中两列元素的对应关系

时间:2014-08-15 10:05:41

标签: python arrays numpy scikit-learn

我有一个包含XY位置的数据文件以及额外列中的一些其他属性。此文件已与代码一起使用,并且已对额外列进行了一些计算。另一方面,基于XY的原始文件的顺序已更改。每个文件包含近25000行。我想找到最快的方法来根据第一个文件中的XY位置对第二个文件进行排序,并将额外的属性附加到原始文件中。 第一个文件的示例:

149.021 204.492 0.187235 0.233713 0.457313 1
478.467 421.622 -0.10692 -0.141686 0.80883 1
160.736 220.413 -0.0236415 -0.0962102 0.591765 1
485.327 60.0308 -0.121497 -0.195995 0.205639 1
497.014 59.1949 -0.00143256 0.0205032 0.179389 1
468.399 421.935 0.0709232 0.144875 1.15085 1
492.597 53.4478 -0.0407651 0.0535784 0.826217 1
153.751 1.22557 -0.194406 0.107156 1.15702 1
66.8625 38.0019 -0.178805 0.1475 0.732446 1
410.695 366.188 -0.179227 -0.216467 0.414247 1
502.513 361.575 -0.114651 -0.0094424 0.966985 1
398.835 61.0347 -0.160149 -0.216436 0.761429 1
459.336 177.548 0.174666 -0.0481024 1.43403 1
111.007 236.622 0.23444 0.201739 1.15933 1
46.9406 255.214 -0.00335369 -0.0306168 0.494205 1
236.685 335.616 -0.00456215 0.0871247 1.26644 1
329.606 231.826 0.131988 0.00122767 1.1712 1
335.467 128.234 -0.0490298 -0.0520559 0.61536 1
53.6696 191.586 0.194366 0.18284 1.47372 1
359.599 148.55 0.127806 -0.0621203 0.559922 1
494.895 431.539 0.201591 0.206185 0.818496 1
342.083 439.732 -0.00373251 -0.0841907 0.383131 1
426.053 201.598 0.0908615 -0.130614 1.23092 1
499.756 443.071 0.195117 0.0999967 0.312757 1
363.483 369.165 0.0791957 -0.0225179 0.319282 1

第二个文件的一部分:

494.895 431.539 -0.0175584 -0.109455 12 1
53.6696 191.586 -0.062199 0.504269 15 1
46.9406 255.214 0.405452 0.237562 6 1
329.606 231.826 -0.371944 -0.0784321 19 1
342.083 439.732 0.100881 -0.0167807 11 1
111.007 236.622 0.0578686 0.223055 12 1
363.483 369.165 0.518668 -0.0620763 18 1
485.327 60.0308 0.271933 -0.0514785 6 1
66.8625 38.0019 -0.191781 -0.104952 9 1
468.399 421.935 -0.1768 0.0328495 8 1
499.756 443.071 0.0240113 -0.146665 14 1
502.513 361.575 0.353556 -0.136077 16 1
149.021 204.492 0.198594 0.256404 1 1
160.736 220.413 0.0992627 0.206257 18 1
410.695 366.188 0.320096 0.0840666 20 1
398.835 61.0347 0.162925 0.081776 20 1
497.014 59.1949 -0.249416 0.239242 15 1
153.751 1.22557 -0.00283959 0.152171 20 1
459.336 177.548 0.297309 0.0990636 11 1
236.685 335.616 0.185583 -0.00510526 19 1
359.599 148.55 0.369466 0.279213 9 1
478.467 421.622 -0.28347 -0.0403472 18 1
426.053 201.598  0.273321 0.150204 5 1
492.597 53.4478 -0.0993111 -0.114191 19 1
335.467 128.234 -0.699557 0.0164072 18 1

1 个答案:

答案 0 :(得分:3)

如果两个数组的行数相同,则可以使用np.lexsort(),这可能会为您提供更好的性能,您只需执行以下操作:

a = np.loadtxt('file1.txt')
b = np.loadtxt('file2.txt')

aind = np.lexsort((a[:,1], a[:,0]))    
bind = np.lexsort((b[:,1], b[:,0]))

a = a[aind]
b = b[bind]

此处新a可以与新b ...

进行比较

编辑: 在对大文件进行一些测试后,我已经删除了基于距离的方法,它需要大量的内存......另一种方法是使用np.in1d()来识别数组{{{1}的值。 1}}包含在数组b中......这样效率更高。对于要比较的ax列不一定是两个第一列的一般情况:

y

现在import numpy as np xcol_a = 6 ycol_a = 7 xcol_b = 0 ycol_b = 1 a = np.loadtxt('file1.txt') b = np.loadtxt('file2.txt') check_x = np.in1d(a[:, xcol_a], b[:, xcol_b]) check_y = np.in1d(a[:, ycol_a], b[:, ycol_b]) check = (check_x & check_y) non_existing_indices = np.where(np.logical_not(check))[0] non_existing_values = a[non_existing_indices] a = a[check] # taking only the values of a that where also found in b aind = np.lexsort((a[:, ycol_a], a[:, xcol_a])) orig_order = np.argsort(aind) bind = np.lexsort((b[:, ycol_b], b[:, xcol_b])) a = a[aind][orig_order] b = b[bind][orig_order] 数组根据数组b排序,并遵循数组a的原始顺序。