【发布时间】:2013-04-08 21:41:50
【问题描述】:
更新:在 numpy 的最新版本(例如 v1.8.1)中,这不再是问题。此处提到的所有方法现在都可以例外。
原问题: 有时使用object dtype存储字符串数组很方便,尤其是当需要在不知道字符串最大长度的情况下修改大型数组的内容时,例如,
>>> 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))
是另一种找出最长字符串长度的方法,而这一步似乎是不可避免的……
【问题讨论】:
-
不是解决方案,但
max(len(x) for x in a)可能比构造列表并调用np.max更快。 -
我在您发表评论之前编辑了问题:D
max(a, key=len)更快。
标签: python string numpy type-conversion