如何最有效地读取python中带有复数的txt文件?

时间:2019-10-09 10:27:04

标签: python fft

我在txt文件中存储了一个2k的空间矩阵,其中有许多列,其复数以-0.0000009-0.0000011i格式编写。我想阅读它,以便进行傅立叶变换和可视化。

我已经尝试过将这些数字存储为列表,但是,我不能再进行傅立叶变换-因为要获得图像傅立叶变换,必须在水平和垂直方向上进行。我已经尝试过的

from scipy.fftpack import fft, ifft
import numpy as np
import csv


#opening and reading file
f = open("data.csv", 'r')
listttal = list(csv.reader(f, delimiter = ","))
listreal = []
listimag = []
#split imaginary and real part 
for i in range(1,len(listttal)):
    rel = listttal[i].split('+')
    listreal.append.parse(rel[1])
    img = rel.split('i')
    listimag.append.parse(img[1])



print(listttal)

#closing file 
f.close()

这是数据的外观。有很多列。

  

-0.0000009-0.0000011i -0.000006-0.0000074i 0.000003-0.0000025i -0.0000059 + 0.000004i -0.0000151-0.0000055i 0.0000084-0.0000155i 0.000004-0.0000013i 0.0000089-0.0000143i 0.0000028-0.0000013i -0.0000011 + 0.0000029i -0.0000103 + 0.0000032i -0.0000103 + 0.0000032i -0.0000024 + 0.0000031i 0.0000045-0.0000058i -0.0000039 + 0.0000011i -0.0000021 + 0.0000104i -0.000001 + 0.000005i -0.0000006 + 0.0000057i -0.0000044 + 0.0000038i 0.0000048 + 0.0000013i 0.000009 + 0.000006i -0.0000042-0.0000069i -0.0000041 + 0.0000043i 0.0000066 + 0.0000029i 0.0000023-0.0000052i -0.0000074-0.0000037i 0.0000106 + 0.0000092i -0.0000041 + 0.0000075i 0.0000005-0.000001i -0.0000018 + 0.0000032i 0.0000042-0.0000039i -0.0000016-0.0000041i 0.0000017-0.0000068i 0.0000022 + 0.0000014i 0.0000066-0.0000001i 0.000002-0.0000086i -0.0000045-0.0000028i -0.0000043 + 0.0000021i 0.0000094 + 0.0000014i 0.0000022-0.0000046i -0.000004 + 0.0000071i 0.000003-0.0000037i -0.0000092 + 0.00000 53i -0.0000014 + 0.000005i 0.0000043-0.0000073i -0.000006 + 0.0000065i 0.0000011 + 0.0000043i -0.000001 + 0.0000004i 0.0000068 + 0.0000068i -0.0000003 + 0.0000068i -0.0000012-0.0000075i -0.0000057-0.0000057i 0.0000025 + 0.0000014i 0.0000006-0.0000037i i -0.0000026 + 0.0000002i -0.0000043 + 0.0000016i -0.0000016 + 0.0000052i -0.000001-0.0000012i 0.0000068-0.0000044i -0.0000001 + 0.0000004i 0.0000002 + 0.0000021i 0.0000032-0.000005i -0.0000028 + 0.0000101i 0.0000025 + 0.0000026i -0.0000045+ 0.0000079i -0.0000002-0.0000092i 0.0000066-0.0000014i 0.0000016 + 0.0000012i 0.0000023 + 0.0000068i 0.0000023 + 0.0000127i 0.0000077 + 0.0000022i 0.0000002 + 0.0000064i 0.0000067 + 0.0000044i 0.0000054 + 0.0000006i -0.0000033 + 0.0000006i 0.0000019 + 0.0000082i 0.0000108-i 0.0000035i 0.0000102-0.0000032i 0.0000048 + 0.0000023i 0.0000007i 0.0000026 + 0.0000042i 0.0000006-0.0000012i 0 -0.0000032 + 0.000005i -0.000001 + 0.0000092i -0.000003 + 0.0000042i 0.0000101-0.0000007i 0.0000072-0.000003i -0.0000021 + 0.0000033i -0.0000035-0.0000027i -0.0000044 + 0.0000035i

我希望能够进行傅立叶运算并可视化这些数字。但是,由于我不知道如何读取和存储它,请帮忙。

2 个答案:

答案 0 :(得分:0)

您可以使用此代码

tmp = open('tmp', 'r').readlines()[1:-1]
tmp = [[complex(item.\
                rstrip().\
                lstrip().\
                replace('i', 'j'))
    for item in line.split('|')
    if len(item.rstrip()) > 0 and item != '\n'] for line in tmp]

假定文件名为tmp

结果tmp是复数列表。

答案 1 :(得分:0)

我不知道傅里叶,但是我可以为每个复数提取实数部分(但可能有特殊情况,例如数据集中的数字0就像那个字符一样)。这是我尝试过的:

import csv
f = open("data.csv", 'r')
listttal = list(csv.reader(f, delimiter=" "))
listreal = []
listimag = []    
listttal = listttal[0]
for i in range(0,len(listttal)):
    realsign = ''
    tmp = listttal[i]
    if listttal[i][0] == '-':
        realsign = '-'
        tmp = listttal[i][1:]    
    argand = tmp.split('-')    
    if(len(argand)) != 2:
        argand = tmp.split('+')    
    realpart = realsign + argand[0]
    print(realpart)

或者,您可以先将数据保留在字符串中,然后提取每个复数的实部:

f = "-0.0000009-0.0000011i -0.000006-0.0000074i 0.000003-0.0000025i -0.0000059+0.000004i -0.0000151-0.0000055i 0.0000084-0.0000155i 0.000004-0.0000013i 0.0000089-0.0000143i 0.0000028-0.0000013i -0.0000011+0.0000029i -0.0000103+0.0000032i -0.0000103+0.0000032i -0.0000024+0.0000031i 0.0000045-0.0000058i -0.0000039+0.0000011i -0.0000021+0.0000104i -0.000001+0.000005i -0.0000006+0.0000057i -0.0000044+0.0000038i 0.0000048+0.0000013i 0.000009+0.000006i -0.0000042-0.0000069i -0.0000041+0.0000043i 0.0000066+0.0000029i 0.0000023-0.0000052i -0.0000074-0.0000037i 0.0000106+0.0000092i -0.0000041+0.0000075i 0.0000005-0.000001i -0.0000018+0.0000032i 0.0000042-0.0000039i -0.0000016-0.0000041i 0.0000017-0.0000068i 0.0000022+0.0000014i 0.0000066-0.0000001i 0.000002-0.0000086i -0.0000045-0.0000028i -0.0000043+0.0000021i 0.0000094+0.0000014i 0.0000022-0.0000046i -0.000004+0.0000071i 0.000003-0.0000037i -0.0000092+0.0000053i -0.0000014+0.000005i 0.0000043-0.0000073i -0.000006+0.0000065i 0.0000011+0.0000043i -0.000001+0.0000004i 0.0000068+0.0000068i -0.0000003+0.0000068i -0.0000012-0.0000075i -0.0000057-0.0000057i 0.0000025+0.0000014i 0.0000006-0.0000037i -0.0000026+0.0000002i -0.0000043+0.0000016i -0.0000016+0.0000052i -0.000001-0.0000012i 0.0000068-0.0000044i -0.0000001+0.0000004i 0.0000002+0.0000021i 0.0000032-0.000005i -0.0000028+0.0000101i 0.0000025+0.0000026i -0.0000045+0.0000079i -0.0000002-0.0000092i 0.0000066-0.0000014i 0.0000016+0.0000012i 0.0000023+0.0000068i 0.0000023+0.0000127i 0.0000077+0.0000022i 0.0000002+0.0000064i 0.0000067+0.0000044i 0.0000054+0.0000006i -0.0000033+0.0000006i 0.0000019+0.0000082i 0.0000108-0.0000035i 0.0000102-0.0000032i 0.0000048+0.0000023i 0.0000007i 0.0000026+0.0000042i 0.0000006-0.0000012i 0 -0.0000032+0.000005i -0.000001+0.0000092i -0.000003+0.0000042i 0.0000101-0.0000007i 0.0000072-0.000003i -0.0000021+0.0000033i -0.0000035-0.0000027i -0.0000044+0.0000035i"

listttal = list(f.split(' '))
listreal = []
listimag = []
for i in range(0,len(listttal)):
    realsign = ''
    tmp = listttal[i]
    if listttal[i][0] == '-':
        realsign = '-'
        tmp = listttal[i][1:]
    argand = tmp.split('-')
    if(len(argand)) != 2:
        argand = tmp.split('+')
    realpart = realsign + argand[0]
    print(realpart)

您可以通过此链接https://repl.it/repls/MildProfuseComputation

在线尝试