我需要将一些long int保存到文本文件中。我使用Numpy savetxt来执行以下操作:
np.savetxt('test.txt', np.c_[objID,z,e,PA,n],fmt='%i %1.4f %1.4f %1.4f %1.4f')
我为%i
尝试%f
或objID
,但text.txt
中的项目不正确。我从源代码中列出了一些objID
,如下所示:
587722952230174996
587722952230175035
587722952230175138
但是,test.txt
中的相同项目变为:
587722952230174976
587722952230174976
587722952230175104
任何人都知道如何解决这个问题?感谢。
答案 0 :(得分:4)
我没有在Py2中安装numpy,但我可以使用普通的Python操作重新创建你的数字:
>>> ll=[587722952230174996,587722952230175035,587722952230175138]
>>> ll
[587722952230174996L, 587722952230175035L, 587722952230175138L]
>>> '%.0f, %.0f, %.0f'%tuple(ll)
'587722952230174976, 587722952230174976, 587722952230175104'
>>> '%i, %i, %i'%tuple(ll)
'587722952230174996, 587722952230175035, 587722952230175138'
问题显示与舍入到浮点一致,但%i
格式化处理它们没有问题。
在py3上使用numpy
In [243]: '%i, %i, %i'%tuple(np.array(ll))
Out[243]: '587722952230174996, 587722952230175035, 587722952230175138'
In [245]: '%i, %i, %i'%tuple(np.array(ll, np.float))
Out[245]: '587722952230174976, 587722952230174976, 587722952230175104'
np.array(ll)
dtype int64
。
==================
我的猜测是:
`np.c_[objID,z,e,PA,n]`
连接值,并创建一个float64数组。其他数字似乎是浮点数,所以即使objID
很长,整个事情都是浮点数。所以%i
格式仍然看到浮动'四舍五入'。
objID',
z'的形状和类型是什么?如果要保留完整的长值,则可能必须将它们连接到结构化数组中。
In [249]: z=[.1,.2,.3]
In [250]: np.c_[ll,z]
Out[250]:
array([[ 5.87722952e+17, 1.00000000e-01],
[ 5.87722952e+17, 2.00000000e-01],
[ 5.87722952e+17, 3.00000000e-01]])
In [255]: np.savetxt('test.csv', data,fmt='%i, %f')
In [256]: cat test.csv
587722952230174976, 0.100000
587722952230174976, 0.200000
587722952230175104, 0.300000
采用结构化阵列路线:
In [274]: ds = np.empty((3,),dtype=[('f0',np.int64),('f1',np.float64)])
In [275]: ds['f0']=ll
In [276]: ds['f1']=z
In [277]: ds
Out[277]:
array([(587722952230174996, 0.1), (587722952230175035, 0.2),
(587722952230175138, 0.3)],
dtype=[('f0', '<i8'), ('f1', '<f8')])
In [278]: np.savetxt('test.csv', ds,fmt='%i, %f')
In [279]: cat test.csv
587722952230174996, 0.100000
587722952230175035, 0.200000
587722952230175138, 0.300000