【问题标题】:python structured array composition and transformationpython结构化数组组合与转换
【发布时间】:2020-04-03 13:37:13
【问题描述】:

我创建了一个脚本,该脚本将 .txt 文件中的大量数据以我想要的格式 [3:4:n] 收集到一个数组中,并且信息记录如下(我认为)。 .txt文件就是这种格式

1.000000e-01 1.000000e-01 1.000000e-01

1.000000e-01 2.000000e-01 3.000000e-01

3.000000e-01 2.000000e-01 1.000000e-01

1.000000e-01 2.000000e-01 4.000000e-01

并重复 N 次,我基本上从 4 行存储到 for 行(就像一个块),因为我正在处理来自 STL 部分的 ASCII 文件。

从这个意义上说,我有这个代码:

f = open("camaSTLfinalmente.txt","r")

b_line = 0
Coord = []
Normal = []
Vertice_coord = []
Tri = []
blook = []

for line in f:
line = line.rstrip()
if(line):

    split = line.split()

    for axis in range(0,3):

        if(b_line == 0):                    #normal
            Normal.append(split[axis])
        else:                               #triangulo
            Vertice_coord.append(split[axis])

    if(b_line > 0):
        Tri.append(Vertice_coord)
        Vertice_coord = []

    if(b_line == 3):
        block.append(Normal)
        block.append(Tri)
        Coord.append(block)
        block = []
        Normal = []
        Tri = []
        b_line = 0
    else:
        b_line+=1

print(Coord[0]) #prints the follow line that I wrote after the code

信息存储方式: [['1.000000e-01', '1.000000e-01', '1.000000e-01'], [['1.000000e-01', '2.000000e-01', '3.000000e-01'], [' 3.000000e-01', '2.000000e-01', '1.000000e-01'], ['1.000000e-01', '2.000000e-01', '-4.000000e-01']]]

有什么办法可以简化吗?

我想借此机会问一下:我想把这些信息转换成数字,理想的情况是读取指数(e)之后的数字并相应地改变数字,即1.000000e-01转到 0,1(为了使用类似的数组进行操作,我在其中存储来自另一个具有相同格式的 .txt 文件的信息)

感谢关注,

佩德罗

【问题讨论】:

    标签: python arrays operators coordinate-transformation simplify


    【解决方案1】:

    您可以尝试将split = line.split() 行更改为:

    split = [float(x) for x in line.split()]
    

    如果您需要结果是字符串而不是浮点数据类型:

    split = [str(float(x)) for x in line.split()]
    

    【讨论】:

    • 好吧,第一部分有效,但是当我得到像 -6.275966e-05 这样的数字或在最坏的情况下像 -6.275966e-17 这样的数字时,它不起作用(我的意思是number 打印为它在 txt 文件中的样子)。如果数字看起来像 -6.275966e-02 ,它会转到 -0.06275966 。我在编程方面很“新”,所以我不知道是否有什么东西使它不适用于大指数数字(“e”之后的数字)
    • 问题在于 python 的十进制数限制。当小数位数过多时,它会自动将数字转换为“e”格式。一种可能的解决方法是使用字符串操作。
    【解决方案2】:

    我不能 100% 确定我是否完全理解您想要什么,但以下代码会产生相同的 Coord

    coord = []
    with open('camaSTLfinalmente.txt','r') as f:
        content = [line.strip().split() for line in f]
    for i in range(len(content)//4): 
        coord.append([content[4*i], content[(4*i+1):(4*i+4)]]) 
    

    关于第二个问题,正如另一个答案中所说,处理包含数字的字符串的最简单方法是将它们转换为数字,然后将它们格式化为字符串。

    s = '1.000000e-01'
    n = float(s)
    m = '{:.1f}'.format(n)
    

    请参阅有关string formatting in the Python doc 的部分。

    两句话:

    • 一般而言,Stackoverflow 不喜欢“如何改进这段代码”形式的问题,请尝试提出更具体的问题。
    • 以上假设您的文件包含 4k 行,如果您在末尾有一些行不构成 4 行,请相应地更改整数除法 ...//4
    • 不要在变量中使用大写字母。虽然风格指南不是强制性的,但遵循它们是一种很好的做法(查阅 PEP-8、pylint 等)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 2020-09-26
      • 1970-01-01
      相关资源
      最近更新 更多