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

时间:2017-08-30 01:06:13

标签: python arrays numpy

我所拥有的是字符串列表。我想用它做的是将它转换为2D numpy数组,其中result[i, j]将是来自第i个字符串的第j个字符的ascii代码(最好是float)。

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

2 个答案:

答案 0 :(得分:2)

您可以使用嵌套列表理解。

import numpy as np 

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

答案 1 :(得分:0)

一个选项可以是使用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_longest(python2)/zip_longest(python3)中的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)]