在loadtxt中避免指数值

时间:2014-06-10 17:18:11

标签: python csv numpy matrix exponential

我有一个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 个答案:

答案 0 :(得分:2)

我希望对这个问题的评论能够清楚地表明这纯粹是一个格式化的问题。在评论中也指出,对于numpy数组的一些格式化选项的一个很好的解释由@unutbu在这里给出:How to pretty-printing a numpy.array without scientific notation and with given precision?

该答案中未显示的选项是formatternp.set_printoptions使用set_printoptions参数。该参数已添加到numpy版本1.7.0中的formatter。使用a参数,您可以控制numpy如何打印数组元素。以下是使用该参数控制浮点数格式的示例。

以下是使用默认设置打印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]]) 的方法:

"%.5f"

现在覆盖默认值,并告诉numpy使用格式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.]] - 表示:

{{1}}