Сравните координаты x, y, z в двух файлах - PullRequest
2 голосов
/ 19 сентября 2019

Я супер новичок в программировании, поэтому я, возможно, спрошу кое-что очень простое.У меня есть файл, который состоит из координат x, y, z и четвертого значения, и второй файл со значениями x, y, z.Координаты второго файла случайным образом содержатся в первом файле.Я хотел найти в первом файле точные координаты второго файла и, если они совпадают, изменить четвертое значение первого файла.

Я написал что-то, что работает, ноэто очень много времени (это занимает три часа ..).Первый файл содержит около 300K строк и 4 столбца, а второй - около 100K и три столбца.

Ниже кода, который я написал:

import numpy as np
with open('first file.txt', 'r') as t1:
    l1=[]
    for line in t1:
        split = line.split()
        l1.append((float(split[0]),float(split[1]),float(split[2]),float(split[3])))
l3=np.asarray(l1)

with open('second file.txt', 'r') as t2:
    l2=[]
    for line in t2:
        split = line.split()
        l2.append((float(split[0]),float(split[1]),float(split[2])))


with open('result file.txt', 'w') as outFile:
    for i in l3:        
        for j in l2:            

            if i[0]==j[0] and i[1]==j[1] and i[2]==j[2]:


                i[3]+=970000000

                #outFile.write(i)
                #print(i[3])
np.savetxt("result file.txt",l3,fmt='%7.4f'*3+'%10.3f')

Если у вас есть какие-либо советы по ускорению этого процесса, пожалуйста, дайте мне знать!

1 Ответ

1 голос
/ 19 сентября 2019

Вы должны использовать set или dict для хранения координат из файлов.Таким образом, вы можете выполнить поиск O (1) вместо того, чтобы сравнивать каждую пару или кординаты из обоих файлов.Таким образом, у вас есть только 300k + 100k итерации вместо 300k x 100k.Примерно так (не проверено):

coords_first = {}
with open('first file.txt', 'r') as t1:
    for line in t1:
        *pts, val = map(float, line.split())
        coords[pts] = val

coords_second = set()
with open('second file.txt', 'r') as t2:
    for line in t2:
        pts = tuple(map(float, line.split()))
        coords_second.add(pts)

with open('result file.txt', 'w') as outFile:
    for pts in coords_first:
        if pts in coords_second:
            new_val = coords_first[pts] + 970000000
            # write points and new value to file

Здесь coords_first отображает координаты из первого файла в значения, то есть {(x1,y1,z1): v1, (x2,y2,z2): v2, ...}.coords_second это просто набор координат из второго файла.Вы также можете обойтись без него и записать файл результатов напрямую, хотя итерируете второй файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...