将元组转换为numpy数组会破坏数据

时间:2013-11-28 11:13:10

标签: python numpy type-conversion

有人能解释这里发生了什么吗?

import numpy as np

test1 = ((154L, u'D2'), (155L, u'D2'), (156L, u'D2'))
print np.asarray(test1)

给出

[[u'15' u'D2']
[u'15' u'D2']
[u'15' u'D2']]

但是

test2 =((154L, u'SG2'), (155L, u'SG2'), (156L, u'SG1'))
print np.asarray(test2)

我们获得

[[u'154' u'SG2']
[u'155' u'SG2']
[u'156' u'SG1']]

test1中的长整数发生了什么

1 个答案:

答案 0 :(得分:0)

据我所知,它与unicode支持有关,如你所示:在第一种情况下,所有6个项目都舍入为2个字符。当你给它们时它们是长整数,但如果你做numpy.asarray(),它们就会变成unicode字符串,其长度与原始数组中最长的unicode字符串相同。在第一种情况下,即2个字符,在第二种情况下,它是3.因此,长整数将数据类型更改为与输入数组中最长的unicode字符串长度相同的unicode字符串。在那一刻,最后的数字消失了(不知道为什么,任何有更多unicode经验的人都知道这是否有意,或者这是不是一个错误?)

编辑:找到一个解决方案:将dtype指定为unicode(并获得正确的长度)

test3 =((154L, u'SG'), (15L, u'SG3'), (1564L, u'SG'))

print(numpy.asarray(test3, dtype='<U4'))

[[u'154' u'SG']
 [u'15' u'SG3']
 [u'1564' u'SG']]

所以在这种情况下,'dtype = ...'表示最大长度为4的unicode,并产生正确的数组