2017-08-30 12 views
1

私は文字列のリストを持っています。私がそれとしたいのは、2Dのnumpy配列に変換することです。ここで、result[i, j]はi番目の文字列(好ましくはfloat)からj番目の文字のASCIIコードになります。文字列のリストをASCIIコードのnumpy配列として表現する

list(map(float, map(ord, single_line_from_list)))私のフロートのリストを取得し、それを1Dアレイに変換してから最終アレイを得るためにループすることができます。しかし、これを行うもっとエレガントな方法があるのだろうかと思います。

+0

あなたがnumpyのの文字列型のいずれかで 'str'代わりの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

これは実際には2次元配列を返さず、リストの配列だけを返します。どのように修正するかについてのアイデア(最大の長さよりも短い列をゼロで埋めてください)。 – Lugi

0

1つのオプションは、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]]) 

またはitertoolsからizip_longest(python2)/zip_longest(python3)を使用します。

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)] 

これは、A与えます2dリストあなたはNonesを埋めるために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)] 
関連する問題