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

Python 为什么numpy在字符串转换时截断数字?,python,python-3.x,numpy,Python,Python 3.x,Numpy,我和一位合作者注意到numpy中有一些我们不理解的奇怪之处。使用Python3.5.4和numpy版本1.14.2-py35ha9ae307_1(加上一个早期版本,我只是为了以防万一而对其进行了更新)可以实现这一点 问题似乎是,如果一个数组向numpy数组中添加一个float和一些字符串,则该float会按预期转换为字符串,但有时(很少)该float会以一种非常奇怪的方式被截断。我不知道这是一个bug还是一些我们不了解的行为。不管怎样,这看起来都很奇怪。任何见解都是有用的 可复制示例 impor

我和一位合作者注意到numpy中有一些我们不理解的奇怪之处。使用Python3.5.4和numpy版本1.14.2-py35ha9ae307_1(加上一个早期版本,我只是为了以防万一而对其进行了更新)可以实现这一点

问题似乎是,如果一个数组向numpy数组中添加一个float和一些字符串,则该float会按预期转换为字符串,但有时(很少)该float会以一种非常奇怪的方式被截断。我不知道这是一个bug还是一些我们不了解的行为。不管怎样,这看起来都很奇怪。任何见解都是有用的

可复制示例

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')
将numpy导入为np
p=np.empty([1,2],dtype='U21')
a=4.4226657709978134e-05
p[0]=np.array(['string',a])
P
#WTF

Out[5]:数组([['string','4.4226657709978134e-0']),dtype='这实际上与Numpy无关。请参阅

Python(3)通常将浮点数表示为字符串,其中的数字最少,可以清楚地表示特定的浮点数值


4.4226657709978137e-05
4.4226657709978138e-05
的情况下,两者都不是用IEEE双精度表示的。在
4.4226657709978137e-05
的情况下,其最短的明确表示恰好是22个字符,而不是21个字符,因此当您尝试将其填充到
中时,如果您想混合str在一个您没有的数组中使用的字符串和浮动使用
pandas
。对象数据类型工作(这就是
pandas
使用的)

[394]中的
a=4.4226657709978134e-05
[395]中的np.array(['string',a])

Out[395]:数组(['string','4.4226657709978134e-05',dtype='它是否与Github上提出的[this issue]()有关?
# 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')
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)
In [398]: np.array([('string',a)],'U10,float')
Out[398]: array([('string', 4.42266577e-05)], dtype=[('f0', '<U10'), ('f1', '<f8')])
In [399]: _.item()
Out[399]: ('string', 4.4226657709978134e-05)