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

Posted

技术标签:

【中文标题】在python中将数组的元素从科学计数法转换为十进制计数法【英文标题】:convert elements of an array from scientific notation to decimal notation in python 【发布时间】:2015-09-17 16:55:19 【问题描述】:

我有一个 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])]

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

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

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

【问题讨论】:

它们不是“科学格式”;在内部,它们是浮点数。它们只是碰巧以上述格式打印。 @ExP 那么如何将它们转换为正常的十进制格式? 不要将显示格式与内部表示混淆。所有计算机浮点数都以指数形式存储。 @hpaulj 那么如何让它以正常格式表示? 你可以把它们变成字符串:`"%f" % yournumber"。但是它们就不再是数字了。 【参考方案1】:

首先,正如一些人所指出的,数字的显示方式和存储方式之间存在很大差异。

如果要将它们转换为字符串,请使用 ':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])

我们只更改了numpy 显示数字的方式。它们仍然是花车。

我们可以对它们进行数学运算,它们的行为就像数字:

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

In [7]: x[0] * 2
Out[7]: 993205447.64829147

转换为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']

现在他们是 list 中的 strings。如果我们对它们进行数学运算,它们的行为会像字符串,而不是数字:

In [6]: x[0] * 2
Out[6]: '256619580.697790256619580.697790'

使用savetxt 控制numpy 数组的保存方式

最后,如果您使用numpy.savetxt,并且想要控制数据如何输出到磁盘,请考虑使用fmt 参数,而不是手动将数组元素转换为字符串。

例如,如果我们要这样做:

np.savetxt('temp.txt', x)

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

8.702970453168644905e+08
9.991634082796489000e+08
5.032002956810175180e+08
2.382398232565869987e+08
1.868727085152311921e+08

但是,我们可以使用fmt 来控制它。请注意,它需要“旧式”% 格式化字符串:

np.savetxt('temp2.txt', x, fmt='%f')

我们会得到:

870297045.316864
999163408.279649
503200295.681018
238239823.256587
186872708.515231

【讨论】:

【参考方案2】:

如果您只想打印它们而不使用科学计数法,您可以使用np.set_printoptions(suppress=True)

【讨论】:

对于它的价值,它只会抑制接近零的数字的科学记数法,而不是大数字。尽管如此,它仍然是一个非常有用的选择! @JoeKington, current set_printoptiions 说“当最小数的绝对值 1e3 时使用科学计数法。”

以上是关于在python中将数组的元素从科学计数法转换为十进制计数法的主要内容,如果未能解决你的问题,请参考以下文章

在bash中将科学记数法转换为十进制

在 bash/perl 中将科学记数法转换为十进制(不是整数)

如何在 Python 中将负指数数转换为十进制数?

在没有科学计数法的 SQL Server 中将 float 转换为 varchar

将科学记数法转换为十进制 - python

如何使用 plink/Unix 将数据从科学计数法转换为十进制?