numpy数组类型设置的奇怪行为

时间:2013-08-29 18:34:11

标签: python numpy

代码

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

返回:

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

documentation说:

  

dtype:data-type,optional

     

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

这是一个错误吗?

2 个答案:

答案 0 :(得分: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,应该注意的是,这比选择dtype="S.."慢大约4倍,但比使用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

答案 1 :(得分:1)

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

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

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

更多信息: Numpy converting array from float to strings