在python中将数组的元素从科学记数法转换为十进制记法

use*_*197 7 python arrays numpy

我有一个numpy数组,其元素是科学格式,我想将它们转换为十进制格式.我的numpy数组看起来像这样:

[array([ 93495052.96955582,  98555123.06146193])]
[array([  1.00097681e+09,   9.98276347e+08])]
[array([  6.86812785e+09,   6.90391125e+09])]
[array([  7.75127468e+08,   8.02369833e+08])]
Run Code Online (Sandbox Code Playgroud)

这是在我的代码中使用此行形成的:

list1.append(np.array(regr.predict(data),dtype = np.float))

现在我想将元素list1从科学格式转换为十进制格式.我四处寻找解决方案并发现print format(0.00001357, 'f')将数字从科学格式转换为十进制格式但是如何使用它来转换我的数组元素?

Joe*_*ton 14

首先,正如几位人士所指出的那样,数字的显示方式和存储方式之间存在很大差异.

如果要将它们转换为字符串,则使用'{:f}'.format(x)(或%等效).

但是,当您以交互方式(或通过print声明)工作时,听起来只是想要以不同方式显示数字.

更改numpy数组的打印方式

numpy数组以交互方式显示的方式由numpy.set_printoptions.

请注意,这不会将数字转换为字符串或以任何方式更改它们.

作为一个简单的例子:

In [1]: import numpy as np

In [2]: x = 1e9 * np.random.random(5)

In [3]: x
Out[3]:
array([  4.96602724e+08,   5.42486095e+08,   4.74495681e+08,
         7.37709684e+07,   9.75410927e+08])

In [4]: np.set_printoptions(formatter={'float_kind':'{:f}'.format})

In [5]: x
Out[5]:
array([496602723.824146, 542486095.316912, 474495680.688025,
       73770968.413642, 975410926.873148])
Run Code Online (Sandbox Code Playgroud)

我们只更改了numpy显示数字的方式.它们仍然漂浮着.

我们可以用数学方法对它们进行操作,它们的行为类似于数字:

In [6]: x[0]
Out[6]: 496602723.82414573

In [7]: x[0] * 2
Out[7]: 993205447.64829147
Run Code Online (Sandbox Code Playgroud)

转换为strings

现在让我们说我们已经将它们转换为字符串列表:

In [1]: import numpy as np

In [2]: x = 1e9 * np.random.random(5)

In [3]: x
Out[3]:
array([  2.56619581e+08,   2.55721261e+08,   3.36984986e+08,
         2.67541556e+08,   9.01048842e+08])

In [4]: x = ['{:f}'.format(item) for item in x]

In [5]: x
Out[5]:
['256619580.697790',
 '255721261.271977',
 '336984986.430552',
 '267541556.373619',
 '901048842.193849']
Run Code Online (Sandbox Code Playgroud)

现在他们是一个liststring.如果我们以数学方式对它们进行操作,它们的行为就像字符串,而不是数字:

In [6]: x[0] * 2
Out[6]: '256619580.697790256619580.697790'
Run Code Online (Sandbox Code Playgroud)

控制numpy数组的保存方式savetxt

最后,如果您正在使用numpy.savetxt,并希望控制数据输出到磁盘的方式,请考虑使用fmt参数而不是手动将数组元素转换为字符串.

例如,如果我们这样做:

np.savetxt('temp.txt', x)
Run Code Online (Sandbox Code Playgroud)

默认情况下,如果数组的ascii表示更紧凑,则它将使用科学记数法:

8.702970453168644905e+08
9.991634082796489000e+08
5.032002956810175180e+08
2.382398232565869987e+08
1.868727085152311921e+08
Run Code Online (Sandbox Code Playgroud)

但是,我们可以控制使用fmt.请注意,它需要"旧式" %格式字符串:

np.savetxt('temp2.txt', x, fmt='%f')
Run Code Online (Sandbox Code Playgroud)

我们会得到:

870297045.316864
999163408.279649
503200295.681018
238239823.256587
186872708.515231
Run Code Online (Sandbox Code Playgroud)


are*_*ced 10

如果您只想在不使用科学计数法的情况下打印它们,则可以执行np.set_printoptions(suppress=True).