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

Posted

技术标签:

【中文标题】如何将 numpy 对象数组转换为 str/unicode 数组?【英文标题】:How to convert numpy object array into str/unicode array? 【发布时间】: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='<U0'.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) 更快。 【参考方案1】:

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

c = a.astype('U')

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

好像数组是用dtype == np._str初始化的,使用astype(str)不会转换dtype 看看这个:***.com/questions/30086936/…

以上是关于如何将 numpy 对象数组转换为 str/unicode 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将numpy数组转换为keras张量

如何将 OHLCV 命名数据数组转换为 numpy 数据帧?

无法将 NumPy 数组转换为张量(不支持的对象类型 numpy.ndarray)错误

将numpy对象数组转换为稀疏矩阵

将 KerasTensor 对象转换为 numpy 数组以在 Callback 中可视化预测

如何将 numpy 数组列表转换为单个 numpy 数组?