如何在Python3中解码numpy编码的文字/字符串数组?AttributeError:'numpy.ndarray'对象没有属性'decode'

Sha*_*ang 8 arrays unicode numpy python-3.x pandas

在Python 3中,我有以下NumPy数组strings.

每个stringNumPy阵列的形式b'MD18EE,而不是MD18EE.

例如:

import numpy as np
print(array1)
(b'first_element', b'element',...)
Run Code Online (Sandbox Code Playgroud)

通常,人们会.decode('UTF-8')用来解码这些元素.

但是,如果我尝试:

array1 = array1.decode('UTF-8')
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

AttributeError: 'numpy.ndarray' object has no attribute 'decode'
Run Code Online (Sandbox Code Playgroud)

如何从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'
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 12

你有一个字节串数组; 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')
Run Code Online (Sandbox Code Playgroud)

astype 很容易将它们转换为unicode,这是Py3的默认字符串类型.

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

还有一个字符串函数库 - 将相应的str方法应用于字符串数组的元素

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

astype速度更快,但decode允许您指定的编码.

另请参见如何解码dtype = numpy.string_的numpy数组?


Wan*_*uta 6

如果您希望结果是 (Python) 字符串列表,您可以使用列表理解:

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

或者,如果您想将其保留为 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'>
Run Code Online (Sandbox Code Playgroud)