2013-08-29 23 views
2

代码怪异的行为设置

np.array([100,200,300],dtype=str) 

回报:

array(['1', '2', '3'], 
     dtype='|S1') 

documentation说:

D类:数据类型,可选

的阵列所需的数据类型。如果没有给出,则该类型将被确定为 ,作为保持该序列中的对象所需的最小类型。

这是一个错误?

+1

你能尝试使用'D型='| S3'',看看是否有给出你的期望? – SethMMorton

+0

最近有人问这个问题,尽管我找不到它。对'numpy'标签的详细搜索应该会引导您。 – Daniel

+0

@SethMMorton使用''| S3''工作 – bheklilr

回答

2

我仍然无法找到的问题,但要解决它:

>>> a=[100,200,300] 

>>> np.char.mod('%d', a) 
array(['100', '200', '300'], 
     dtype='|S3') 

这就避免你的问题:

>>> a=[100,200,3005] 
>>> np.char.mod('%d', a) 
array(['100', '200', '3005'], 
     dtype='|S4') 

的晦涩documentation,应该指出的是,这是约4倍然后选择dtype="S.."较慢,但使用np.array(map(str,a))方法的速度非线性更快。

你也可以做一些巧妙的事情:

>>> a 
[1234.5, 123.4, 12345] 

>>> np.char.mod('%s',a) 
array(['1234.5', '123.4', '12345.0'], 
     dtype='|S7') 

>>> np.char.mod('%f',a) 
array(['1234.500000', '123.400000', '12345.000000'], 
     dtype='|S12') 

>>> np.char.mod('%d',a) #Note the truncation of decimals here. 
array(['1234', '123', '12345'], 
     dtype='|S5') 

>>> np.char.mod('%s.stuff',a) 
array(['1234.5.stuff', '123.4.stuff', '12345.0.stuff'], 
     dtype='|S13') 

更多信息,可以发现here

+0

谢谢!你能添加一个链接到这个函数的文档吗? – Bitwise

+0

我还更新了一些额外的例子,这取决于你在做什么'%d'可能不是最适合你的。 – Daniel

1

您看到此行为的原因是您必须指定每个字符串元素的大小,例如使用:

>>> np.array([100,200,300],dtype='S3') 
     array(['100', '200', '300'], 
      dtype='|S3') 

否则每个元素串的大小将默认为1

此处了解详情: Numpy converting array from float to strings

+0

问题是,要做到这一点的任意数字列表,我需要首先检查所有数字的长度。 – Bitwise