但是,这里的解决方案是更改数据保存的格式
好消息,你不必这样做!
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)
(如果您使用的是 Python 2.x,并且文件很大,您可能需要使用itertools.imap
而不是map
.)
“在此处插入代码”部分,您可以从有效的答案中填写,但不是可接受的解决方案,因为它需要修改文件。由于我在您的链接中没有看到这样的答案,所以我不确定那是什么,但例如,也许是这样的:
def transform_complex(line):
return line.replace(b'+ -', b'- ')
在本地进行测试,看起来您的输入实际上存在三个问题。
你可以测试输出什么should看起来像使用savetxt
。例如:
>>> arr = np.array([1-2j])
>>> f = io.BytesIO()
>>> np.savetxt(f, arr)
>>> f.getvalue()
b' (1.000000000000000000e+00-2.000000000000000000e+00j)\n'
(在 Python 2.x 中,你不会看到b
字首。)
并非所有这些差异都是相关的 - 您不必使用指数表示法,不需要括号等 - 但看起来这三个是:
- 周围不允许有任何空间
+
以复数形式。
- 虚数单位必须是
j
, not i
.
- No
+-
允许。
So:
def transform_complex(line):
return line.replace(b' ', b'').replace(b'+-', b'-').replace(b'i', b'j')