2017-08-30 43 views
1

我所擁有的是一個字符串列表。我想要做的是將它轉換爲2D numpy數組,其中result[i, j]將是第i個字符串(最好是float)的第j個字符的ascii代碼。將字符串列表表示爲其ASCII碼的一個numpy數組

我知道我可以使用list(map(float, map(ord, single_line_from_list)))來獲得我的浮動列表,將其轉換爲1D數組,然後循環所有這些來獲得我的最終數組。但我想知道是否有更優雅的方式來做到這一點。

+0

是否有您所使用的'str'而不是用numpy的的字符串類型之一ndarray一個'list'一個特別的原因? – o11c

+0

另外,當所有的值都符合'dtype = uint8'時,我不確定你認爲你通過'dtype = float'獲得了什麼,這是存儲的少得多,並且通常根據需要進行轉換。 – o11c

回答

1

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

import numpy as np 

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

預製ndarray,然後填充將避免臨時。 – o11c

+0

這實際上並不返回二維數組,只是一個列表數組。關於如何解決這個問題的任何想法(只填充比零最大長度短的列)。 – Lugi

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參數來填補諾內斯:

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)] 
相關問題