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''
_は必要ありません)
編集:
この方法でエンコードされた特定の列のみを使用してPandas
DataFrame
を処理していたとしましょう。例えば:
_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'
_
バイト文字列の配列があります。 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
を使用するとエンコードを指定できます。
結果を文字列の(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'>