避免loadtxt中的指数值
我有一个 csv
文件,里面有一些标题,比如:
这是一个 test.csv
文件:
"A","B","C","D","E","F","timestamp"
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291111964948
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291113113366
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291120650486
如果我使用 load.txt
,那么我会得到一个包含3行7列的数组,里面的值是 exponential
(科学计数法)的形式。
r1 = numpy.loadtxt(open("test.csv","rb"),delimiter=",",skiprows=1)
我得到的结果是
[[ 6.11882430e+02 9.08956010e+03 5.13300000e+03 8.64075140e+02
1.71537476e+03 7.65227770e+02 1.29111196e+12]
[ 6.11882430e+02 9.08956010e+03 5.13300000e+03 8.64075140e+02
1.71537476e+03 7.65227770e+02 1.29111311e+12]
[ 6.11882430e+02 9.08956010e+03 5.13300000e+03 8.64075140e+02
1.71537476e+03 7.65227770e+02 1.29112065e+12]]
为了避免出现 exponential
的值,我用了以下代码,但结果还是显示了相同的科学计数法值。我的代码是为了避免科学计数法:
r1 = np.loadtxt(open("test.csv","rb"),delimiter=",", dtype=np.float64, skiprows=1)
有没有办法在创建numpy矩阵的时候就去掉 exponential
的显示?我知道可以在之后用 numpy.savetxt(sys.stdout, r1, '%5.2f')
来去掉这些值,但我希望在创建矩阵的时候就能做到,而不是创建之后再处理。
1 个回答
我希望问题下的评论能让大家明白,这纯粹是一个格式化的问题。评论中也提到,@unutbu 在这里提供了一些关于 numpy 数组格式化选项的不错解释:如何在不使用科学计数法且指定精度的情况下美观地打印 numpy.array?
在那个回答中没有提到的一个选项是使用 formatter
参数来设置 np.set_printoptions
。这个参数是在 numpy 1.7.0 版本中新增的。通过 formatter
参数,你可以控制 numpy 打印数组元素的方式。下面是一个使用这个参数来控制浮点数格式的例子。
这是 a
在默认设置下的打印效果:
In [30]: a
Out[30]:
array([[ 6.11882430e+02, 9.08956010e+03, 5.13300000e+03,
8.64075140e+02, 1.71537476e+03, 7.65227770e+02,
1.29111196e+12],
[ 6.11882430e+02, 9.08956010e+03, 5.13300000e+03,
8.64075140e+02, 1.71537476e+03, 7.65227770e+02,
1.29111311e+12],
[ 6.11882430e+02, 9.08956010e+03, 5.13300000e+03,
8.64075140e+02, 1.71537476e+03, 7.65227770e+02,
1.29112065e+12]])
现在我们来覆盖默认设置,告诉 numpy 使用格式 "%.5f"
将浮点值转换为字符串。这个格式不会使用科学计数法,并且总是会在小数点后显示五位数字。
In [31]: np.set_printoptions(formatter={'float': lambda x: "%.5f" % (x,)})
In [32]: a
Out[32]:
array([[611.88243, 9089.56010, 5133.00000, 864.07514, 1715.37476,
765.22777, 1291111964948.00000],
[611.88243, 9089.56010, 5133.00000, 864.07514, 1715.37476,
765.22777, 1291113113366.00000],
[611.88243, 9089.56010, 5133.00000, 864.07514, 1715.37476,
765.22777, 1291120650486.00000]])
你可以添加一个 rstrip
的调用来去掉末尾的零:
In [53]: np.set_printoptions(formatter={'float': lambda x: ("%.5f" % (x,)).rstrip('0')})
In [54]: a
Out[54]:
array([[611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777,
1291111964948.],
[611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777,
1291113113366.],
[611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777,
1291120650486.]])
注意,在上面的例子中,我在 ipython
中输入了变量名,它会返回这个变量的值。当这样使用时,会打印出对象的 repr
表示。如果你想显示 str
表示,需要显式地打印出来:
In [55]: print(a)
[[611.88243 9089.5601 5133. 864.07514 1715.37476 765.22777 1291111964948.]
[611.88243 9089.5601 5133. 864.07514 1715.37476 765.22777 1291113113366.]
[611.88243 9089.5601 5133. 864.07514 1715.37476 765.22777 1291120650486.]]