我正在将一些代码从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字符串?
答案 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版本的关系不如数组和结构化数组之间的区别。