gpt4 book ai didi

python - Numpy:使用 savetxt() 导出时使用 genfromtxt() 中的 dtype

转载 作者:太空宇宙 更新时间:2023-11-03 17:47:42 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com