web-dev-qa-db-ja.com

Python3でエンコードされたリテラル/文字列の派手な配列をデコードする方法は? AttributeError: 'numpy.ndarray' object has no attribute 'decode'

Python 3には、以下のNumPy配列stringsがあります。

string配列の各NumPyは、_b'MD18EE_ではなく_MD18EE_の形式です。

例えば:

_import numpy as np
print(array1)
(b'first_element', b'element',...)
_

通常、これらの要素をデコードするには.decode('UTF-8')を使用します。

ただし、私が試した場合:

_array1 = array1.decode('UTF-8')
_

次のエラーが発生します。

_AttributeError: 'numpy.ndarray' object has no attribute 'decode'
_

これらの要素をNumPy配列からデコードするにはどうすればよいですか? (つまり、_b''_は必要ありません)

編集:

この方法でエンコードされた特定の列のみを使用してPandasDataFrameを処理していたとしましょう。例えば:

_import pandas as pd
df = pd.DataFrame(...)

df
        COL1          ....
0   b'entry1'         ...
1   b'entry2'
2   b'entry3'
3   b'entry4'
4   b'entry5'
5   b'entry6'
_
9
ShanZhengYang

バイト文字列の配列があります。 dtypeはSです:

In [338]: arr=np.array((b'first_element', b'element'))
In [339]: arr
Out[339]: 
array([b'first_element', b'element'], 
      dtype='|S13')

astypeは、それらをPy3のデフォルトの文字列型であるUnicodeに簡単に変換します。

In [340]: arr.astype('U13')
Out[340]: 
array(['first_element', 'element'], 
      dtype='<U13')

文字列関数のライブラリもあります-対応するstrメソッドを文字列配列の要素に適用します

In [341]: np.char.decode(arr)
Out[341]: 
array(['first_element', 'element'], 
      dtype='<U13')

astypeの方が高速ですが、decodeを使用するとエンコードを指定できます。

参照 dtype = numpy.string_?のnumpy配列をデコードする方法

12
hpaulj

結果を文字列の(Python)リストにしたい場合は、リスト内包表記を使用できます。

>>> l = [el.decode('UTF-8') for el in array1]
>>> print(l)
['element', 'element 2']
>>> print(type(l))
<class 'list'>

あるいは、Numpy配列として保持したい場合は、np.vectorizeを使用して、ベクトル化されたデコーダー関数を作成できます。

>>> decoder = np.vectorize(lambda x: x.decode('UTF-8'))
>>> array2 = decoder(array1)
>>> print(array2)
['element' 'element 2']
>>> print(type(array2))
<class 'numpy.ndarray'>
3
Wander Nauta