我和一个合作者发现,在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)通常将浮点数表示为字符串,以最少的数字来明确表示该特定浮点值。
在这两种情况下4.4226657709978137e-05
,并4.4226657709978138e-05
没有被IEEE双打准确表示。在4.4226657709978137e-05
最短的唯一表示形式的情况下,恰好是22个字符,而不是21个字符,因此当您尝试将其填充到a中时,<U21
它会被截断。
要用科学计数法表示大多数双打,您至少需要24个字符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句