为什么numpy在字符串转换时截断数字?

2024-10-01 19:25:07 发布

您现在位置:Python中文网/ 问答频道 /正文

一个合作者和我注意到了纽比身上一些我们不理解的奇怪的东西。使用python3.5.4和numpy版本1.14.2-py35ha9ae307_1(加上我更新的较早版本,以防万一)会发生这种情况。在

问题似乎是,如果将一个float与一些字符串一起添加到numpy数组中,那么float将按预期转换为字符串,但有时(很少)float会以非常奇怪的方式被截断。我不知道这是一个错误还是一些我们不理解的行为。不管怎样,这看起来很奇怪。任何洞察力都是有用的。在

可复制示例

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')

这也取决于浮点数的最后一位

^{pr2}$

这个问题很容易解决,例如,通过切换到可以处理不同类型的Pandas数据帧。但这种行为似乎很奇怪。我们之所以注意到这一点,是因为我们在数百万个数字上做了这项工作,并且通过健全性检查突出显示了这一点(我们所有的数字都应该是<;1,而且我们偶尔会得到数字>1)。在


Tags: 字符串版本numpystringnp方式情况数字
2条回答

这可不是什么纽比的事。见https://stackoverflow.com/a/25899600/982257

Python(3)通常将float表示为具有最少位数的字符串,以清楚地表示特定的float值。在

4.4226657709978137e-05和{}的情况下,两者都不是由IEEE双精度表示的。在4.4226657709978137e-05的情况下,它最短的明确表示恰好是22个字符,而不是21个字符,因此当您试图将其填充到<U21中时,它会被截断。在

要表示科学记数法中的大多数双数,您至少需要24个字符。在

如果要在数组中混合字符串和浮点,则不需要使用pandas。Object dtype工作(这就是pandas使用的)

In [394]: a = 4.4226657709978134e-05
In [395]: np.array(['string',a])
Out[395]: array(['string', '4.4226657709978134e-05'], dtype='<U22')
In [396]: np.array(['string',a], object)
Out[396]: array(['string', 4.4226657709978134e-05], dtype=object)

或结构化数据类型:

^{pr2}$

相关问题 更多 >

    热门问题