У меня есть два файла облака точек (Scene и Green) в формате .txt. Облако точек сцены обычно содержит более 100000 линий, а зеленое - 20000 строк. Эти два файла имеют одинаковые линии для зеленых точек, за исключением последнего числа, которое является меткой для каждой точки.
Сцена:
0.805309, -3.43696, 6.85463, 0, 0, 0, 5
0.811636, -3.42248, 6.82576, 0, 0, 0, 5
-1.00663, 0.0985967, 3.02769, 42, 134, 83, 5
-1.00182, 0.098547, 3.02617, 43, 133, 83, 5
-0.997052, 0.0985018, 3.02478, 41, 133, 82, 5
0.811636, -3.42248, 6.82576, 0, 0, 0, 5
Зеленый:
-1.00663, 0.0985967, 3.02769, 42, 134, 83, 3
-1.00182, 0.098547, 3.02617, 43, 133, 83, 3
-0.997052, 0.0985018, 3.02478, 41, 133, 82, 3
Я хочу заменить всю строку в зеленой точке сцены на ее равную линию в файле Green или изменить номер метки с 5 на 3, если обе линии равны. Окончательный результат будет выглядеть следующим образом: Сцена:
0.805309, -3.43696, 6.85463, 0, 0, 0, 5
0.811636, -3.42248, 6.82576, 0, 0, 0, 5
-1.00663, 0.0985967, 3.02769, 42, 134, 83, 3
-1.00182, 0.098547, 3.02617, 43, 133, 83, 3
-0.997052, 0.0985018, 3.02478, 41, 133, 82, 3
0.811636, -3.42248, 6.82576, 0, 0, 0, 5
Я написал два типа кода, чтобы сделать это, но оба они загружаются в течение значительного количества времени, что не хорошовообще, из-за того, что у меня есть много файлов для изменения. Первый код:
import os
import fileinput
def main(scene, others):
for file in others:
other = open(file, "r+")
for line in other:
line1 = line[:-3]
f=scene
for sceneLine in fileinput.input(f,inplace=True):
new = sceneLine
sceneLine1 = sceneLine[:-3]
if sceneLine1 == line1:
print(sceneLine.replace(new, line), end='')
else:
print(sceneLine.replace(line,line), end='')
fileinput.close()
others = []
for file in os.listdir("./"):
if file.endswith(".txt"):
if file.startswith("pointCloudScene9863Cl"):
scene = file
else:
others.append(file)
main(scene,others)
Второй код:
import os
import fileinput
import numpy
def main(scene1, others):
pointcloud = []
scene1 = open(scene1,"r+")
scene = []
for each_point in scene1:
scene.append(each_point)
for file in others:
other = open(file, "r+")
for line in other:
pointcloud = []
line1 = line[:-3]
for sceneLine in scene:
sceneLine1 = sceneLine[:-3]
if sceneLine1 == line1:
pointcloud.append(line)
else:
pointcloud.append(sceneLine)
scene = pointcloud
with open('pointcloud.txt', 'w') as points:
for item in scene:
points.write("%s" % item)
others = []
for file in os.listdir("./"):
if file.endswith(".txt"):
if file.startswith("pointCloudScene9863Cl"):
scene = file
else:
others.append(file)
main(scene,others)
Оба они отлично работают с небольшим количеством точек, но когда я использую свой файл оригинальных облаков точек,затем требуется более 30 минут или даже больше, чтобы закончить работу. Я на самом деле вижу проблему в FOR LOOP, когда я в основном использую NESTED LOOPS, что означает, что у меня будет 100000 * 20000 циклов для изменения зеленых точек.
Есть ли эффективный способ, используя массивы numpy или любые другие методы?