numpy.genfromtxt(infile, dtype=None)
在确定输入文件每列中的数字格式方面做得非常好。当使用 numpy.savetxt() 保存数据文件时,我们如何使用那些相同的已经确定的类型? Savetxt 使用非常不同的格式语法。
indata = '''
1000 254092.500 1630087.500 9144.00 9358.96 214.96
422 258667.500 1633267.500 6096.00 6490.28 394.28
15 318337.500 1594192.500 9144.00 10524.28 1380.28
-15 317392.500 1597987.500 6096.00 4081.26 -2014.74
-14 253627.500 1601047.500 21336.00 20127.51 -1208.49
END
'''
代码
import numpy as np
header = 'Scaled_Residual,X,Y,Local_Std_Error,Vertical_Std_Error,Unscaled_Residual'
data = np.genfromtxt(indata, names=header, dtype=None,
comments='E') #skip 'END' lines
print data.dtype
发出:
[('Scaled_Residual', '<i4'), ('X', '<f8'), ('Y', '<f8'), ('Local_Std_Error', '<f8'), ('Vertical_Std_Error', '<f8'), ('Unscaled_Residual', '<f8')]
如何优雅地重构 data.dtype
使其适合 savetxt(... fmt='%i, %f, ...'
语法而无需手动单步执行它?是否有一个我没有发现的savefromgentxt()推论?
对fmt=data.dtype
的简单而充满希望的尝试完全失败了。 ;-)
np.savetxt('test.csv', data, header=header, delimiter=',',
fmt=data.dtype)
结果:
...snip...\numpy\lib\npyio.py", line 1047, in savetxt
fh.write(asbytes(format % tuple(row) + newline))
UnboundLocalError: local variable 'format' referenced before assignment
最佳答案
fmt
应该是格式字符串或字符串列表。请参阅 savetxt
文档中的示例。它不是dtype
。
np.savetxt('test.csv',data, fmt='%10s')
已完成 90%:
1000 254092.5 1630087.5 9144.0 9358.96 214.96
422 258667.5 1633267.5 6096.0 6490.28 394.28
15 318337.5 1594192.5 9144.0 10524.28 1380.28
-15 317392.5 1597987.5 6096.0 4081.26 -2014.74
-14 253627.5 1601047.5 21336.0 20127.51 -1208.49
通过为每列指定一个带有小数位数等的 fmt 字符串,您会更接近。
np.savetxt('test.csv',data, fmt='%10d %10.3f %10.3f %10.2f %10.2f %10.2f')
效果更好。您可以进一步调整 fmt
。
savetxt
的 Python 代码并不复杂。我建议看看。
从 dtype
生成任何更精美的内容的问题是没有更多信息。
In [154]: [x[1] for x in data.dtype.descr]
Out[154]: ['<i4', '<f8', '<f8', '<f8', '<f8', '<f8']
比较这些格式:
In [158]: '%i %f %f %f %f %f'%tuple(data[0])
Out[158]: '1000 254092.500000 1630087.500000 9144.000000 9358.960000 214.960000'
In [159]: '%s %s %s %s %s %s'%tuple(data[0])
Out[159]: '1000 254092.5 1630087.5 9144.0 9358.96 214.96'
In [160]: ' '.join(['%10s']*6)%tuple(data[0])
Out[160]: ' 1000 254092.5 1630087.5 9144.0 9358.96 214.96'
dtype
信息的简单翻译:
def foo(astr):
if 'i' in astr:
return '%10i'
elif 'f' in astr:
return '%10f'
[foo(x[1]) for x in data.dtype.descr]
# ['%10i', '%10f', '%10f', '%10f', '%10f', '%10f']
您还可以使用dtype
名称来生成标题行。
关于python - Numpy:使用 savetxt() 导出时使用 genfromtxt() 中的 dtype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29550686/