如何将numpy对象数组转换为str / unicode数组?

时间:2013-04-16 13:03:07

标签: python string numpy type-conversion

更新:在numpy的最新版本(例如,v1.8.1)中,这不再是问题。这里提到的所有方法现在都是例外。

原始问题:有时使用对象dtype来存储字符串数组很方便,尤其是当需要修改大型数组的内容而不事先了解字符串的最大长度时,例如,< / p>

>>> import numpy as np
>>> a = np.array([u'abc', u'12345'], dtype=object)

在某些时候,人们可能希望将dtype转换回unicode或str。但是,简单的转换会截断长度为4或1的字符串(为什么?),例如

>>> b = np.array(a, dtype=unicode)
>>> b
array([u'abc', u'1234'], dtype='<U4')
>>> c = a.astype(unicode)
>>> c
array([u'a', u'1'], dtype='<U1')

当然,人们总是可以明确地迭代整个数组来确定最大长度,

>>> d = np.array(a, dtype='<U{0}'.format(np.max([len(x) for x in a])))
array([u'abc', u'12345'], dtype='<U5')

然而,在我看来,这有点尴尬。有更好的方法吗?

编辑添加:根据此closely related question

>>> len(max(a, key=len))

是找出最长字符串长度的另一种方法,这一步似乎是不可避免的......

2 个答案:

答案 0 :(得分:14)

我知道这是一个老问题,但如果有人遇到它并正在寻找答案,请尝试

c = a.astype('U')

你应该得到你期望的结果:

c = array([u'abc', u'12345'], dtype='<U5')

答案 1 :(得分:1)

至少在Python 3.5 Jupyter 4中我可以使用:

a=np.array([u'12345',u'abc'],dtype=object)
b=a.astype(str)
b

对我来说效果很好并且返回:

array(['12345', 'abc'],dtype='<U5')