在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
转换为string
s
现在假设我们已将它们转换为字符串列表:
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
中的 string
s。如果我们对它们进行数学运算,它们的行为会像字符串,而不是数字:
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, currentset_printoptiions
说“当最小数的绝对值 1e3 时使用科学计数法。”
以上是关于在python中将数组的元素从科学计数法转换为十进制计数法的主要内容,如果未能解决你的问题,请参考以下文章
在 bash/perl 中将科学记数法转换为十进制(不是整数)