python - 为什么numpy会在字符串转换时截断数字?
问题描述
我和一个合作者注意到 numpy 中有一些我们不理解的奇怪之处。使用 Python 3.5.4 和 numpy 版本 1.14.2-py35ha9ae307_1(加上一个较早的版本,我更新了以防万一)会发生这种情况。
问题似乎是,如果将浮点数与一些字符串一起添加到 numpy 数组中,浮点数会按预期转换为字符串,但有时(很少)浮点数会以非常奇怪的方式被截断。我不知道这是一个错误还是我们不理解的一些行为。无论哪种方式,这似乎都很奇怪。任何见解都会很有用。
可重现的例子
import numpy as np
p = np.empty([1,2],dtype='U21')
a = 4.4226657709978134e-05
p[0] = np.array(['string',a])
p
# WTF
Out[5]: array([['string', '4.4226657709978134e-0']], dtype='<U21')
这也取决于浮点数的最后一位
# Works as expected
In [26]: np.array(['string',4.4226657709978130e-05], dtype='<U21')
Out[26]: array(['string', '4.422665770997813e-05'], dtype='<U21')
# Works as expected
In [27]: np.array(['string',4.4226657709978131e-05], dtype='<U21')
Out[27]: array(['string', '4.422665770997813e-05'], dtype='<U21')
# Doesn't work as expected
In [28]: np.array(['string',4.4226657709978132e-05], dtype='<U21')
Out[28]: array(['string', '4.4226657709978134e-0'], dtype='<U21')
# Doesn't work as expected
In [29]: np.array(['string',4.4226657709978133e-05], dtype='<U21')
Out[29]: array(['string', '4.4226657709978134e-0'], dtype='<U21')
# Doesn't work as expected
In [30]: np.array(['string',4.4226657709978134e-05], dtype='<U21')
Out[30]: array(['string', '4.4226657709978134e-0'], dtype='<U21')
# Doesn't work as expected
In [31]: np.array(['string',4.4226657709978135e-05], dtype='<U21')
Out[31]: array(['string', '4.4226657709978134e-0'], dtype='<U21')
# Doesn't work as expected
In [32]: np.array(['string',4.4226657709978136e-05], dtype='<U21')
Out[32]: array(['string', '4.4226657709978134e-0'], dtype='<U21')
# Doesn't work as expected
In [33]: np.array(['string',4.4226657709978137e-05], dtype='<U21')
Out[33]: array(['string', '4.4226657709978134e-0'], dtype='<U21')
# Works as expected
In [34]: np.array(['string',4.4226657709978138e-05], dtype='<U21')
Out[34]: array(['string', '4.422665770997814e-05'], dtype='<U21')
# Works as expected
In [35]: np.array(['string',4.4226657709978139e-05], dtype='<U21')
Out[35]: array(['string', '4.422665770997814e-05'], dtype='<U21')
这个问题很容易解决,例如通过切换到可以处理不同类型的 Pandas 数据框。但这种行为似乎很奇怪。我们注意到这一点只是因为我们对数百万个数字执行此操作,并且完整性检查突出显示了它(我们所有的数字都应该 <1,而且我们偶尔会开始得到 >1 的数字)。
解决方案
这与 Numpy 无关。请参阅https://stackoverflow.com/a/25899600/982257
Python(3) 通常将浮点数表示为具有明确表示特定浮点值所需的最少数字的字符串。
在这两种情况下,IEEE 双精度都4.4226657709978137e-05
不能4.4226657709978138e-05
准确表示。在4.4226657709978137e-05
最短的明确表示的情况下,恰好是 22 个字符,而不是 21 个,因此当您尝试将其填充到 a<U21
中时,它会被截断。
要以科学计数法表示大多数双精度数,您至少需要 24 个字符。
推荐阅读
- javascript - 如何导入 Material Components Web Select Menu JS 组件
- .net-core - 在没有 UI 的情况下针对 Azure AD 验证用户名/密码?
- sql-server - 动态 SQL 中的 SQLCMD?
- python-2.7 - 在谷歌应用引擎的 app.yaml 中运行 cron 和 login:admin 时出现错误 302
- javascript - Vue动态子子组件
- perl - 用 Perl 解析语法
- python - 查找固定长度数字的所有可能排列以达到给定总和
- c# - 将方法上的泛型类型约束为从抽象泛型基类的任何变体形式派生的任何类
- database - 是否有文本编辑器、编辑器插件或 NLP 算法可以解连接一串单词,中间没有空格
- mysql - Amazon Aurora 是否为在从节点上运行的只读事务提供可序列化隔离?