2017-09-17 19 views
1

私はすべて同じ10個のキーワードで辞書のリストを持っています。辞書のリストを1Dのnumpyの配列に変換する

10個の1D numpy配列に変換するきちんとした方法をお探しです。効率は重要ではない。

現在20行のコードです。

names = [x['name'] for x in fields] 
names = np.asarray(names) 

など

+0

*効率は重要ではありません*何か特別な理由から? – ZdaR

+0

したがって、出力は2D配列になりますか、それとも1D配列のリストになりますか? – Divakar

+0

パンダを使用している場合は、 'pd.DataFrame(fields).T.values' – Zero

答えて

0

あなたは、ネストされたリストの内包表記を使用することができます。

[np.asarray([x[attribute] for x in fields]) for attribute in ['name', 'age', 'address']] 

や辞書の理解:例として

{attribute:np.asarray([x[attribute] for x in fields]) for attribute in ['name', 'age', 'address']} 

>>> fields = [{'name': 'A', 'age': 25, 'address' : 'NYC'}, {'name': 'B', 'age': 32, 'address' : 'LA'}] 

>>> [np.asarray([x[attribute] for x in fields]) for attribute in ['name', 'age', 'address']] 
[array(['A', 'B'], 
     dtype='|S1'), array([25, 32]), array(['NYC', 'LA'], 
     dtype='|S3')] 
>>> {attribute:np.asarray([x[attribute] for x in fields]) for attribute in ['name', 'age', 'address']} 
{'age': array([25, 32]), 'name': array(['A', 'B'], 
     dtype='|S1'), 'address': array(['NYC', 'LA'], 
     dtype='|S3')} 

は自動的な方法で属性を取得するには、使用できます。

>>> pd.DataFrame(fields) 
    address age name 
0  NYC 25 A 
1  LA 32 B 

それは速いたくさんのようになります

>>> fields[0].keys() 
['age', 'name', 'address'] 

最後に、パンダ​​はおそらくあなたのデータのために最も適したタイプです配列のリストに対して何らかの操作を実行できるようにする必要があります。

+1

括弧で囲まれた' np.asarray([x]はフィールドのxの属性) '? – Zero

+0

@zero:確かに。ありがとう –

0

Aを辞書の入力リストとします。

np.column_stack([i.values() for i in A]) 

サンプルラン - - キーワードごとに各列の保持データを有する2Dアレイ出力について

In [217]: A # input list of 2 dictionaries, each with same 3 keywords 
Out[217]: 
[{'a': array([6, 8, 2]), 'b': array([7, 7, 3]), 'c': array([6, 6, 4])}, 
{'a': array([4, 4, 3]), 'b': array([7, 1, 6]), 'c': array([6, 1, 5])}] 

In [244]: np.column_stack([i.values() for i in A]) 
Out[244]: 
array([[6, 8, 2, 4, 4, 3], # key : a 
     [6, 6, 4, 6, 1, 5], # key : c 
     [7, 7, 3, 7, 1, 6]]) # key : b 

# Get those keywords per row with `keys()` : 
In [263]: A[0].keys() 
Out[263]: ['a', 'c', 'b'] 

つ以上のサンプルラン

In [245]: fields # sample from @Eric's solution 
Out[245]: 
[{'address': 'NYC', 'age': 25, 'name': 'A'}, 
{'address': 'LA', 'age': 32, 'name': 'B'}] 

In [246]: np.column_stack([i.values() for i in fields]) 
Out[246]: 
array([['25', '32'], 
     ['A', 'B'], 
     ['NYC', 'LA']], 
     dtype='|S21') 

In [267]: fields[0].keys() 
Out[267]: ['age', 'name', 'address'] 
+0

うん、それは私を 'map(list、zip(* i.values()for fields in))')に導く。 – Zero

+0

@Zero恐ろしい!それも動作します。しかしOPはおそらくアレイを望んでいた。だから、それ以上のことをする必要があると思う。 – Divakar

+0

はい、または 'np.array(zip(* [i.values()for i in fields]))' – Zero

関連する問題