使用i而不是j加载带有复数的文本文件

2024-10-05 17:39:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个新的python程序员,所以如果这是一个愚蠢的问题,请原谅。 我正在加载一个包含复数的txt文件。这是来自实际大文件txt文件的2x4示例(i用作虚数,而不是j):

0.633399474768199 - 0.0175109522504542i 0.337208501994460 + 0.00414157519417569i    0.462845433000816 + 0.0311199272434047i 0.248496359856117 + 0.000929998413548307i
0.633719938420320 - 0.0168830372084714i 0.364374358580293 + 0.0247026480558120i 0.460808199213633 + 0.0346904985858835i 0.251160695519198 - 0.00257247233248499i

尝试使用以下方式加载文件:

data = np.loadtxt(path, dtype=np.complex_) 

显然,只有当我删除所有值的实部和虚部之间的+和-之前和之后的所有空格时,错误才得以解决,我还需要用j替换I

0.633399474768199-0.0175109522504542j   0.337208501994460+0.00414157519417569j

我可以手动执行此操作(不适用于大数据),是否有更简单的加载方法?由于我不确定如何删除+和-,前后的空格,而不影响单独值之间的空格,这不是所有值之间的一致性,因此某些值之间的空格比其他值多,例如三个值之间的空格不同:

0.633830049713846 - 0.0164809219396847i 0.375552117859690 + 0.00970977484227810i    0.473980903316675 + 0.0360707252275126i

Tags: 文件pathtxt示例datanp方式程序员
2条回答

不创建新文件的替代解决方案:

import numpy as np

with open(path, "r") as f:
    lines = f.readlines()
    
data = []
for line in lines:
    #remove spaces before and after "+" and create a list around "i" character
    line2 = [elem.replace(" + ", "+") for elem in line.split("i")[:-1:]]
    #id with "-"
    line2 = [elem.replace(" - ", "-") for elem in line2]
    # add a "j" character at the end of each element
    line2 = [elem+"j" for elem in line2]
    data.append(line2)

#convert to a complex numpy ndarray
data = np.array(data, dtype=np.complex128)

最简单的方法可能是用所需的格式编写一个新文件。例如,您可以执行以下操作:

with open(yourinputfile, 'rt') as f, open('output.txt', 'wt') as g:
    for line in f:
        pairs = [k.replace(' ', '') for k in line.split('i')][:-2]
        g.write('j '.join(pairs) + 'j\n')

表达式line.split('i')在每个i字符处分割输入字符串。例如,如果该行是

 '0.633399474768199 - 0.0175109522504542i 0.337208501994460 + 0.00414157519417569i    0.462845433000816 + 0.0311199272434047i 0.248496359856117 + 0.000929998413548307i'

split(i)将生成字符串列表

['0.633399474768199 - 0.0175109522504542', ' 0.337208501994460 + 0.00414157519417569', '    0.462845433000816 + 0.0311199272434047', ' 0.248496359856117 + 0.000929998413548307', '']

注意列表末尾的空字符串。[:-2]是一种拾取除最后一个字符串之外的所有字符串的方法。然后k.replace(' ', '')删除每对中的所有空格

然后'j '.join(pairs) + 'j\n'使用string类的join方法将一个j (注意空格)固定到除最后一个之外的每个对的末尾。我们在最后一行加上一个j和一个换行符,然后将其写入一个新文件

完成此操作后,您可以按照最初的意图使用np.loadtxt

相关问题 更多 >