将Numpy数组中的ASCII码转换为字符串。

9
我想将一个由整数表示ASCII码的NumPy数组转换为相应的字符串。 例如,ASCII码97等于字符"a"。 我尝试过以下方法:
from numpy import *
a=array([97, 98, 99])
c = a.astype('string')
print c

它提供:

['9' '9' '9']

但是我想要获取字符串 "abc"

6个回答

11

另一个无需离开NumPy世界的解决方案是将数据视为字符串:

arr = np.array([97, 98, 99], dtype=np.uint8).view('S3').squeeze()

如果您的NumPy数组不是8位整数:

arr = np.array([97, 98, 99]).astype(np.uint8).view('S3').squeeze()

然而,在这些情况下,您必须将正确的长度附加到数据类型(例如,对于3个字符的字符串,使用“S3”)。


10
print "".join([chr(item) for item in a])

输出

abc

感谢Ashoka提供的好解决方案。我一直过于专注于尝试使用NumPy函数,但这似乎是一个优雅的解决方案。 - Håkon Hægland

7

创建一个字节数组并使用ASCII编解码器对其进行字节表示的解码:

np.array([98,97,99], dtype=np.int8).tostring().decode("ascii")

请注意,tostring 的命名不太合适,它实际上返回的是字节,这在 Python2 中刚好是一个字符串,在 Python3 中你会得到字节类型,需要进行解码。

6

1
from numpy import array

a = array([97, 98, 99])
print("{0:c}{1:c}{2:c}".format(a[0], a[1], a[2]))

当然,这里也可以使用join和列表推导式。

但这仅适用于len(a) == 3,看起来非常脆弱。 - jonrsharpe
@jonrsharpe 我应该提到我只是想展示“format()”方法。它可以在循环内使用。 - nouseforname

1

如果使用Python循环或字符串格式化的解决方案在处理大型数据集时会变得很慢。如果您知道所有的数据都是ASCII编码,更快的方法可能是使用高级索引:

import numpy as np
a = np.array([97, 98, 99])
np.array([chr(x) for x in range(127)])[a]
# array(['a', 'b', 'c'], dtype='<U1')

一个优点是它适用于任意形状的数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接