Reputation: 40778
I would like to convert a NumPy array of integers representing ASCII codes to the corresponding string.
For example ASCII code 97 is equal to character "a"
.
I tried:
from numpy import *
a=array([97, 98, 99])
c = a.astype('string')
print c
which gives:
['9' '9' '9']
but I would like to get the string "abc"
.
Upvotes: 10
Views: 19410
Reputation: 191
import numpy as np
np.array([97, 98, 99], dtype='b').tobytes().decode("ascii")
Output:
'abc'
tostring() is deprecated since version 1.19.0. Use tobytes() instead.
Upvotes: 6
Reputation: 1522
Solutions that rely on Python loops or string formatting will be slow for large datasets. If you know that all of your data are ASCII, a faster approach could be to use fancy indexing:
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')
An advantage is that it works for arbitrarily shaped arrays.
Upvotes: 1
Reputation: 748
from numpy import array
a = array([97, 98, 99])
print("{0:c}{1:c}{2:c}".format(a[0], a[1], a[2]))
Of course, join
and a list comprehension can be used here as well.
Upvotes: 1
Reputation: 1537
Another solution that does not involve leaving the NumPy world is to view the data as strings:
arr = np.array([97, 98, 99], dtype=np.uint8).view('S3').squeeze()
or if your numpy array is not 8-bit integers:
arr = np.array([97, 98, 99]).astype(np.uint8).view('S3').squeeze()
In these cases however you do have to append the right length to the data type (e.g. 'S3' for 3 character strings).
Upvotes: 11
Reputation: 2434
create an array of bytes and decode the the byte representation using the ascii codec:
np.array([98,97,99], dtype=np.int8).tostring().decode("ascii")
note that tostring
is badly named, it actually returns bytes which happens to be a string in python2, in python3 you will get the bytes type back which need to be decoded.
Upvotes: 7