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

标签 python numpy

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/

相关文章:

python - 使用相应的行对 Python 列进行排序

python - 如果我们使用索引矩阵,是否需要在 Theano 中使用 flatten 和 reshape?

python - 检查数组行是否为None并为其赋值

python - 随机遍历有向图

python - python 代码中的 genfromtxt 查找缺失的列

python - 从 numpy 数组中查找并删除列

python - 在 Python 中查找对称矩阵的 SVD

python - 确定将哪个类实现导入到模块中

python - 如果只有一个结果,则替代列表理解

python - 如何使用 apt.progress 类检查 python_apt 中 commit() 的进度?