numpy.genfromtxt为带有减号的复数提供nan?

时间:2017-11-02 20:21:17

标签: python numpy nan genfromtxt

我在文件中有一些复杂的数字,由np.savetxt()编写:

(8.67272e-09+-1.64817e-07j)
(2.31263e-08+1.11916e-07j)
(9.73642e-08+-7.98195e-08j)
(1.05448e-07+7.00151e-08j)

这是一个文件" test.txt"。 当我使用`np.genfromtxt(' test.txt',dtype = complex)时,我得到:

                nan +0.00000000e+00j,
     2.31263000e-08 +1.11916000e-07j,
                nan +0.00000000e+00j,
     1.05448000e-07 +7.00151000e-08j,

这是一个错误,还是我可以做些什么来避免从负数中获取nan

1 个答案:

答案 0 :(得分:2)

这是a bug that has been reported on the numpy github repository。问题是当savetxt虚部为负时,'+'会写出一个包含外部'+'的字符串。从Python的角度来看,In [95]: complex('1+-2j') --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-95-56afbb08ca8f> in <module>() ----> 1 complex('1+-2j') ValueError: complex() arg is a malformed string 是无关紧要的:

1+-2j

请注意genfromtxt是有效的Python 表达式。这表明使用a中的转换器来评估表达式。

例如,这是一个复杂的数组In [109]: a Out[109]: array([1.0-1.j , 2.0+2.5j, 1.0-3.j , 4.5+0.j ])

a

foo.txt保存到In [110]: np.savetxt('foo.txt', a, fmt='%.2e') In [111]: !cat foo.txt (1.00e+00+-1.00e+00j) (2.00e+00+2.50e+00j) (1.00e+00+-3.00e+00j) (4.50e+00+0.00e+00j)

genfromtxt

使用ast.literal_eval读回数据。对于转换器,我将使用In [112]: import ast In [113]: np.genfromtxt('foo.txt', dtype=np.complex128, converters={0: lambda s: ast.literal_eval(s.decode())}) Out[113]: array([1.0-1.j , 2.0+2.5j, 1.0-3.j , 4.5+0.j ])

'+-'

或者,您可以使用转换器将'-'的出现替换为In [117]: np.genfromtxt('foo.txt', dtype=np.complex128, converters={0: lambda s: complex(s.decode().replace('+-', '-'))}) Out[117]: array([1.0-1.j , 2.0+2.5j, 1.0-3.j , 4.5+0.j ])

UICollectionView