为什么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)通常将浮点数表示为字符串,以最少的数字来明确表示该特定浮点值。

在这两种情况下4.4226657709978137e-05,并4.4226657709978138e-05没有被IEEE双打准确表示。4.4226657709978137e-05最短的唯一表示形式的情况下,恰好是22个字符,而不是21个字符,因此当您尝试将其填充到a中时,<U21它会被截断。

要用科学计数法表示大多数双打,您至少需要24个字符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么awk在进行算术运算时将数字转换成字符串?

为什么字符串转换不是数字促销的类型?

写入文件时,PrintWriter会截断字符串,为什么?

将数字设置为对象值时,为什么将其转换为字符串,以及如何避免使用它

numpy ndarray截断字符串时抛出异常

在对字符串进行操作时,为什么将字符串转换为charArray?

为什么Javascript将字符串中的数字转换为数字?

算术异常数字溢出或字符串截断字符串右截断火鸟,插入表时

在VBA中使用ADODB SQL,为什么只有在使用分组时才将字符串截断[至255]?

为什么打字稿将数字转换为字符串?

为什么parseInt()无法正确转换我的数字字符串?

为什么我在Rails中将属性字符串转换为数字

为什么 isNaN() 不能将空字符串转换为数字?

将窄字符串转换为宽字符串时,为什么要用0xFF屏蔽字符?

从字符串转换日期和/或时间时转换失败-为什么?

从托管实例中的字符串转换日期和/或时间时转换失败-为什么?

转换截断的日期时间字符串

当我使用numpy genfromtxt函数将字符串转换为整数时,为什么对于我要转换的内容全为0

为什么 is_numeric() 在传递看似数字的字符串时返回 false?

当变量是字符串时,为什么程序会打印数字?

为什么在传递给printf时必须将字符串转换为c_str(c字符串)?

Mysql 字符串在选择时被截断

Javascript仅当字符串是数字时才将字符串转换为数字

尝试绘制mpmath.pcfd时,为什么为什么我的'float()参数必须是字符串或数字,而不是'mpc'?

为什么Kotlin从字符串转换时给我错误的Int值

使用对象分解分配时,为什么将属性“名称”强制转换为字符串?

在Go中,为什么在转换为字符串时不使用Stringer接口?

在Swift中,为什么尝试从字符串转换为日期时出现错误?

将对象用作地图时,其键始终会转换为字符串。为什么?