[英]How to resolve type errors while creating arrays with custom dtypes in numpy?
我正在將一些代碼從python 2移植到python3。在我的代碼中,我將字符串的數據類型定義為:
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字符串?
我最終得以弄清楚:
使用標記的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版本的關系比與數組和結構化數組的區別少。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.