我需要从文本文件中读取复杂数字到numpy数组.我的问题类似于这个使用numpy.savetxt和numpy.loadtxt编写和读取复数,但是,这里的解决方案是改变数据保存的格式.我没有这个奢侈,因为文本文件是由生成的其他我无法改变的软件.文本文件的示例如下:
25 + 0i
8.43818 + -4.94194i
4.46817 + -5.08305i
4.55764 + -3.02201i
2.69138 + -5.43104i
-0.151334 + -4.83717i
1.98336 + -1.3339i
3.59002 + -0.932973i
1.42727 + -0.617317i
1.02005 + -1.14214i
-0.15564 + 2.74564i
Run Code Online (Sandbox Code Playgroud)
我尝试过以下方法:
np.loadtxt('file.txt',delimiter='\n',dtype=np.complex128)
Run Code Online (Sandbox Code Playgroud)
但是我得到错误:
ValueError: complex() arg is a malformed string
Run Code Online (Sandbox Code Playgroud)
我读过的帖子暗示这是+ -某些行中的符号问题,但是,即使+删除了额外的符号,我也会得到相同的错误.
但是,这里的解决方案是改变保存数据的格式
好消息,你不必!
numpy.loadtxt 可以采用任何可迭代的行,而不仅仅是文件对象.
因此,您可以将文件对象包装在一个简单的生成器中,该生成器可以动态地转换行,并将其提供给loadtxt,每个人都会很高兴.
像这样:
def transform_complex(line):
# insert your code here
with open('file.txt', 'rb') as f:
lines = map(transform_complex, f)
arr = np.loadtxt(lines, dtype=np.complex128)
Run Code Online (Sandbox Code Playgroud)
(如果您使用的是Python 2.x,并且文件很大,您可能希望使用itertools.imap而不是map.)
"在此处插入代码"部分,您可以从有效的答案填写,但不是一个可接受的解决方案,因为它需要修改文件.由于我没有在你的链接中看到这样的答案,我不确定那是什么,但是例如,也许就是这样:
def transform_complex(line):
return line.replace(b'+ -', b'- ')
Run Code Online (Sandbox Code Playgroud)
在本地测试一些东西,看起来你的输入实际上有三个错误.
您可以测试输出应该使用的内容savetxt.例如:
>>> arr = np.array([1-2j])
>>> f = io.BytesIO()
>>> np.savetxt(f, arr)
>>> f.getvalue()
b' (1.000000000000000000e+00-2.000000000000000000e+00j)\n'
Run Code Online (Sandbox Code Playgroud)
(在Python 2.x中,您将看不到b前缀.)
并非所有这些差异都是相关的 - 你不必使用指数表示法,你不需要parens等等 - 但看起来这三个是:
+在复数中不允许有空格.j,而不是i.+-允许.所以:
def transform_complex(line):
return line.replace(b' ', b'').replace(b'+-', b'-').replace(b'i', b'j')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2657 次 |
| 最近记录: |