Numpy savetxt不能正确处理18个ditgits long int

时间:2016-12-01 00:08:52

标签: python numpy text

我需要将一些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尝试%fobjID,但text.txt中的项目不正确。我从源代码中列出了一些objID,如下所示:

587722952230174996
587722952230175035
587722952230175138

但是,test.txt中的相同项目变为:

587722952230174976
587722952230174976
587722952230175104

任何人都知道如何解决这个问题?感谢。

1 个答案:

答案 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