避免loadtxt中的指数值

0 投票
1 回答
2975 浏览
提问于 2025-04-18 09:19

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

2

我希望问题下的评论能让大家明白,这纯粹是一个格式化的问题。评论中也提到,@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.]]

撰写回答