簡體   English   中英

在numpy中使用自定義dtypes創建數組時,如何解決類型錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM