我有一个包含X
和Y
位置的数据文件,以及额外列中的一些其他属性。该文件已与代码一起使用,并对额外的列进行了一些计算。另一方面,原有的基于X
和Y
的文件顺序发生了变化。每个文件包含近25000行。我想找到最快的方法,根据第一个文件中的X
和Y
位置对第二个文件进行排序,并将额外的属性附加到原始文件。第一个文件的示例:
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
如果两个数组确实有相同的行数,您可以使用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()
来识别数组b
的哪些值包含在数组a
中…这样效率更高。对于比较x
和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
排序,并遵循数组a
的原顺序。