Python 将字符串列表表示为其ascii代码的numpy数组

Python 将字符串列表表示为其ascii代码的numpy数组,python,arrays,numpy,Python,Arrays,Numpy,我有一个字符串列表。我想用它做的是将其转换为2D numpy数组,其中result[I,j]将是第I个字符串中第j个字符的ascii码(最好是浮点) 我知道我可以使用list(map(float,map(ord,single\u line\u from\u list))来获得我的float列表,将其转换为1D数组,然后循环所有这些来获得最终数组。但我想知道是否有更优雅的方式来做到这一点 您可以使用嵌套列表理解 import numpy as np array = np.array([[flo

我有一个字符串列表。我想用它做的是将其转换为2D numpy数组,其中
result[I,j]
将是第I个字符串中第j个字符的ascii码(最好是浮点)


我知道我可以使用
list(map(float,map(ord,single\u line\u from\u list))
来获得我的float列表,将其转换为1D数组,然后循环所有这些来获得最终数组。但我想知道是否有更优雅的方式来做到这一点

您可以使用嵌套列表理解

import numpy as np 

array = np.array([[float(ord(character)) for character in word] for word in words])

一个选项是使用
scipy.sparse.coo_matrix
创建稀疏矩阵,然后将其转换为稠密矩阵:

from scipy.sparse import coo_matrix

lst = ['hello', 'world!!']
​
idx, idy, val = zip(*((i, j, ord(c)) for i, s in enumerate(lst) for j, c in enumerate(s)))   ​
coo_matrix((val, (idx, idy)), shape=(max(idx)+1, max(idy)+1)).todense()

#matrix([[104, 101, 108, 108, 111,   0,   0],
#        [119, 111, 114, 108, 100,  33,  33]])

或者使用
izip\u longest(python2)/zip\u longest(python3)
from
itertools

from itertools import izip_longest

list(zip(*izip_longest(*map(lambda s: map(ord, s), lst))))
# [(104, 101, 108, 108, 111, None, None), (119, 111, 114, 108, 100, 33, 33)]
这给出了一个2d列表。您可以使用
fillvalue
参数来填充Nones:

list(zip(*izip_longest(*map(lambda s: map(ord, s), lst), fillvalue=0)))
# [(104, 101, 108, 108, 111, 0, 0), (119, 111, 114, 108, 100, 33, 33)]

预先构建一个数组,然后填充它可以避免临时数组。这实际上并不会返回一个2D数组,只是一个列表数组。你知道如何解决这个问题吗(只是用零填充比最大长度短的列)。你使用
str
list
而不是带有numpy字符串类型的ndarray有什么特殊原因吗,我不确定当所有的值都适合
dtype=uint8
时,您认为使用
dtype=float
会得到什么好处,因为这样存储空间小得多,而且值通常会根据需要进行转换。