如何在numpy中使用自定义dtypes创建数组时解决类型错误?

时间:2016-11-12 19:45:41

标签: python arrays numpy unicode

我正在将一些代码从python 2移植到python 3.在我的代码中,我将字符串的数据类型定义为:

MAX_WORD_LENGTH = 32
DT_WORD = np.dtype([('word', str('U') + str(MAX_WORD_LENGTH))])

显示为:

>> DT_WORD.descr
[('word', '<U32')]

现在,当我创建一个基本的numpy数组时,我没有错误:

>> import numpy as np
>> np.array(['a', 'b', 'c', 'd'])
array(['a', 'b', 'c', 'd'],
    dtype='<U1')

但是当我介绍我的数据类型时,

>> np.array(['a','b','c','d'], dtype=DT_WORD)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'

这个错误是什么意思?默认情况下,python 3中的所有字符串都是Unicode,因此通过明确地将数据类型声明为Unicode,我不应该收到错误。如何定义我的数据类型,以便它接受python 2和3中的unicode字符串?

1 个答案:

答案 0 :(得分:2)

我终于弄清楚了:

使用带标签的dtypes时,数组实际上是结构化数组。结构化数组数组是从元组列表(而不仅仅是值列表)创建的。所以:

np.array(['a','b','c','d'], dtype=DT_WORD)

应该是:

np.array([('a',), ('b',), ('c',), ('d',)], dtype=DT_WORD)

更简洁地说,如果X是字符串列表,您可以使用:

np.array(list(zip(X)), dtype=DT_WORD)

与python 2和3兼容。

此外,相同的代码也将在python 2中提供TypeError

np.array(['a','b','c','d'], dtype=DT_WORD)
# Will give:
TypeError: expected a readable buffer 

所以我的问题首先是部分不正确。它与python版本的关系不如数组和结构化数组之间的区别。

相关问题