- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个 .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
我想用绿色文件中的相同行替换场景绿色点中的整行,或者只要两条行相等,就将标签编号从 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 循环中看到了问题,这意味着我将有 100000*20000 个循环来更改绿点。
是否有使用 numpy 数组或任何其他方法的有效方法?
最佳答案
我有一个应该足够的解决方案,但在我讨论之前,免责声明:如果没有您提供的更多信息,将不可能找到合适的解决方案。我们需要这个问题的上下文,以及关于数据格式和你正在尝试做什么的更精确和详细的信息。
例如,比较 float 是否相等感觉不太好,一般对数字的操作在精度方面总是有一定的风险等。由于这些点似乎来自同一个地方,如果每个人都有某种独特的 ID,可用于检查是否相等。
和这里的其他一些人一样,我的第一 react 是捕获 numpy 和 pandas。这是我的一个错误,因为这个任务根本不涉及太多数据操作或转换。
那么,这是我现在能想到的最简单的实现:
def point_parse(line):
line_point = line.split(", ")
line_point[0] = float(line_point[0])
line_point[1] = float(line_point[1])
line_point[2] = float(line_point[2])
line_point[3] = int(line_point[3])
line_point[4] = int(line_point[4])
line_point[5] = int(line_point[5])
line_point[6] = int(line_point[6])
return tuple(line_point)
green_points_set: frozenset
black_points_set: frozenset
with open("../resources/Green_long.txt", "r") as green_file:
green_points_set = frozenset((point_parse(line)[:-1] for line in green_file))
with open("../resources/Black_long.txt", "r") as black_file:
black_points_set = frozenset((point_parse(line)[:-1] for line in black_file))
def set_point_label(point):
point_comp = point[:-1]
if point_comp in green_points_set:
point_comp += (3,)
elif point_comp in black_points_set:
point_comp += (4,)
else:
point_comp = point
return point_comp
with open("../resources/Scene_long.txt", "r") as scene_file:
scene_points_new = (set_point_label(point_parse(line)) for line in scene_file)
form_lines = ((f"{res_line[0]}, {res_line[1]}, {res_line[2]}, {res_line[3]}, "
f"{res_line[4]}, {res_line[5]}, {res_line[6]}\n") for res_line in scene_points_new)
with open("../out/Scene_out.txt", "w") as scene_out:
scene_out.writelines(form_lines)
代码非常简单。为绿点和黑点创建集合,我们测试成员资格,并适本地更改标签。
我为自己创建了一些训练数据:一个总共有 1,000,000 个点、125,000 个绿点和 125,000 个黑点的场景。运行时间不到 7 秒(希望我没有犯任何严重错误!),内存使用应该很低。
关于python - 用另一个文件的行替换文件的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58286285/
我想对一个字符串执行搜索和替换,比如 password。 正如您从问题中了解到的那样,替换后的字符串应变为 sdvvzrug。 但不幸的是,下面的代码输出bbbbcaab: $search = ran
我正在使用 futurize --stage2它应用了许多源代码转换以使代码 python2 和 python3 兼容。其中一个修复是所有分区 a/b 都替换为 old_div(a/b),我想避免这种
我正在使用 RStudio,但我在控制台上的输出被截断了。我找不到如何停止截断(我尝试搜索 ?options 以及在谷歌上搜索的时间比我想承认的要长)。 编辑:我向大家道歉!我最初的长名称为“This
我有一个 fragment 堆栈,我在其中使用替换和相加。添加或替换我的 fragment 的代码(在我的 Activity 中)如下 private fun addFragment(fragment
我在一个数组中插入了一些字符串,但在我这样做之前,我想按照主题所说的去做。只用 %20 替换空格,我这样做: Name.push(linkText.replace(" ", "%20")); 但是我如
我正在尝试编译和测试我在网上看到的代码 Expanding an IP add 。但是,当我尝试编译它时,我收到有关 StringBuilder 替换方法的错误。它说: IPadd.java:52:
我正在尝试使用 dplyr 的最新功能重写我的部分代码,方法是将 data.frame() 替换为 data_frame() 和 cbind() 与 bind_cols(): library(rgeo
我最近偶然发现了 replace()和 "[ x.tst s.tst s.tst [,1] [,2] [,3] [1,] 0 0 0
我一直想知道,如何在给定的参数内进行替换。 如果你有这样的一行: 123,Hello,World,(I am, here), unknown 你想更换 World与 Foobar那么这是一个简单的任务
如何转义字符串中的双引号?例如, input: "Nobody" output: \"Nobody\" 我尝试过这样的操作,但不起作用: String name = "Nobody"; name.r
我正在做类似的事情: SQL sql sQl SqL var ps = document.getElementsByTagName('p'); for(var i = 0; i 但它不会替换文本。
我正在尝试用 \" 替换所有 " 并用 JSON 解析字符串,但浏览器抛出错误 SyntaxError: JSON Parse error: Unrecognized token '\'. 下面是代码
大家好,在这里挣扎...... 是否可以将第一个正斜杠之间的任何内容替换为“”,但保留其余部分? 例如var 将是 string "/anything-here-this-needs-to-be-re
在下面的代码中,JavaScript 替换函数中的 alert(a) 将提醒匹配的字符串,在本例中,将是 {name} 和 {place}。 这按照文档 javascript docs 的描述工作,即
+-----------------------------+ | tables | +-------------------
我正在尝试用\"替换包含 "的字符串,下面是我尝试过的程序 String s="\"/test /string\""; s = s.replaceAll("\"", "\\\"");
var text = "a's ..a's ...\"... "; text = convert(text); function convert( text ) { var n = text
我正在尝试使用 JavaScript 中的替换函数,但有一个问题。 strNewDdlVolCannRegion = strNewDdlVolCannRegion.replace(/_existing
好吧,首先我对我的上一篇文章感到非常抱歉,但我真的需要帮助,我会把我真正想要的东西放在一个更清晰的代码中。我不擅长 javascript,所以希望你能帮助我。
我正在写一张纸条,遇到了障碍。可能有更有效的方法来执行此操作,但我对 Python 还很陌生。我正在尝试创建用户生成的 IP 地址列表。我正在使用 print 来查看生成的值是否正确。当我运行此代码时
我是一名优秀的程序员,十分优秀!