2016-08-24 8 views
0

辞書を正方行列に変換する方法を学びたいと思っています。私が読んだことから、これを数の少ない配列に変換し、それを再構成する必要があります。私は、ユーザーが入力する情報に基づいてこれを実行できるようにしたいので、形を変えたくありません。つまり、ユーザーが何人かの所有者や品種を入力しても正方行列を与えるコードが必要です。辞書を正方行列に変換する

注:この辞書の所有者と品種は、ユーザーの入力によって異なります。ユーザは100の名前と50の品種を入力することができ、または4つの名前と5つの品種を入力することができる。この例では、私は4つの名前と3つの犬を行いました。例えば

dict1 = 
{'Bob VS Sarah': {'shepherd': 1,'collie': 5,'poodle': 8}, 
'Bob VS Ann': {'shepherd': 3,'collie': 2,'poodle': 1}, 
'Bob VS Jen': {'shepherd': 3,'collie': 2,'poodle': 2}, 
'Sarah VS Bob': {'shepherd': 3,'collie': 2,'poodle': 4}, 
'Sarah VS Ann': {'shepherd': 4,'collie': 6,'poodle': 3}, 
'Sarah VS Jen': {'shepherd': 1,'collie': 5,'poodle': 8}, 
'Jen VS Bob': {'shepherd': 4,'collie': 8,'poodle': 1}, 
'Jen VS Sarah': {'shepherd': 7,'collie': 9,'poodle': 2}, 
'Jen VS Ann': {'shepherd': 3,'collie': 7,'poodle': 2}, 
'Ann VS Bob': {'shepherd': 6,'collie': 2,'poodle': 5}, 
'Ann VS Sarah': {'shepherd': 0,'collie': 2,'poodle': 4}, 
'Ann VS Jen': {'shepherd': 2,'collie': 8,'poodle': 2}, 
'Bob VS Bob': {'shepherd': 3,'collie': 2,'poodle': 2}, 
'Sarah VS Sarah': {'shepherd': 3,'collie': 2,'poodle': 2}, 
'Ann VS Ann': {'shepherd': 13,'collie': 2,'poodle': 4}, 
'Jen VS Jen': {'shepherd': 9,'collie': 7,'poodle': 2}} 

4人の所有者が存在するので、私は、(再び、ユーザが入力することができる犬の品種の任意の数のSO 3つの品種は、制限ではない)、4×4行列を求めています。

最終結果が欲しいと思っているものを入れていないと、通常は私は謝ります。私はdict1を作るために自分自身を誇りに思います:)。だから、辞書は以下のような形でなければなりませんが、私はどのように異なる品種を組み込むか分かりません。私のための難しい部分は、私は1つのマトリックスが必要なだけです。私はまた、行列のソルバnumpyを使用することを計画している、なぜ私は辞書から正方行列を取得する方法を把握したいと思います。

 Bob  Sarah  Ann  Jen 
Bob 

Sarah 

Ann 

Jen 
+0

あなたは何を明確でしたあなたは最終結果を望んでいますか?行列の 'Ann'とcol 'Ann'のような行は、 '{'shepherd':13、 'collie':2、 'poodle':4}'の値を持つべきですか? – gowrath

+0

はい、(Ann、Ann)は{'shepherd':13、 'collie':2、 'poodle':4}になります。私はこれを直接配列に変換してから辞書に戻すかどうかはわかりません。 –

答えて

2

{name1: {name1:data, name2:data, name3:data, ...}, 
name2: {name1:data, name2:data, name3:data, ...}, 
... 
} 

あなたはちょうどハンそれをpandas DataFrameに追加すれば、それがあなたのためになります。位置row = name1 and col = name2のデータはname1 vs name2の値になります。ここでそれを行いますコードは次のとおりです。

from collections import defaultdict 
import pandas 

result = defaultdict(dict) 
for key,value in dict1.items(): 
    names = key.split() 
    name1 = names[0] 
    name2 = names[2]  
    result[name1][name2] = value 

df = pandas.DataFrame(result).transpose() 
print(df) 

これは、次のような出力が得られます。

       Ann         Bob          Jen          Sarah 
Ann {'shepherd': 13, 'collie': 2, 'poodle': 4} {'shepherd': 6, 'collie': 2, 'poodle': 5} {'shepherd': 2, 'collie': 8, 'poodle': 2} {'shepherd': 0, 'collie': 2, 'poodle': 4} 
Bob  {'shepherd': 3, 'collie': 2, 'poodle': 1} {'shepherd': 3, 'collie': 2, 'poodle': 2} {'shepherd': 3, 'collie': 2, 'poodle': 2} {'shepherd': 1, 'collie': 5, 'poodle': 8} 
Jen  {'shepherd': 3, 'collie': 7, 'poodle': 2} {'shepherd': 4, 'collie': 8, 'poodle': 1} {'shepherd': 9, 'collie': 7, 'poodle': 2} {'shepherd': 7, 'collie': 9, 'poodle': 2} 
Sarah {'shepherd': 4, 'collie': 6, 'poodle': 3} {'shepherd': 3, 'collie': 2, 'poodle': 4} {'shepherd': 1, 'collie': 5, 'poodle': 8} {'shepherd': 3, 'collie': 2, 'poodle': 2} 

numpyの配列への簡単な変換は次のようになります。

numpy_array = df.as_matrix() 
print(numpy_array) 

[[{'shepherd': 13, 'collie': 2, 'poodle': 4} 
    {'shepherd': 6, 'collie': 2, 'poodle': 5} 
    {'shepherd': 2, 'collie': 8, 'poodle': 2} 
    {'shepherd': 0, 'collie': 2, 'poodle': 4}] 
[{'shepherd': 3, 'collie': 2, 'poodle': 1} 
    {'shepherd': 3, 'collie': 2, 'poodle': 2} 
    {'shepherd': 3, 'collie': 2, 'poodle': 2} 
    {'shepherd': 1, 'collie': 5, 'poodle': 8}] 
[{'shepherd': 3, 'collie': 7, 'poodle': 2} 
    {'shepherd': 4, 'collie': 8, 'poodle': 1} 
    {'shepherd': 9, 'collie': 7, 'poodle': 2} 
    {'shepherd': 7, 'collie': 9, 'poodle': 2}] 
[{'shepherd': 4, 'collie': 6, 'poodle': 3} 
    {'shepherd': 3, 'collie': 2, 'poodle': 4} 
    {'shepherd': 1, 'collie': 5, 'poodle': 8} 
    {'shepherd': 3, 'collie': 2, 'poodle': 2}]] 
+0

私はパンダについて素晴らしいことを聞いたことがあります。私はPythonの初心者ですが、私はちょうどまだ接線に行く準備ができているかどうかわかりません –

+1

@ Caroline.py問題は、numpy配列は行列演算に優れていますが、行と列の値これは、パンダが埋める空間です。良いことは、パンダの配列をnumpty配列に変換するのは信じられないことです。あなたがしなければならないのは 'numpy_array = df.as_matrix()'だけです。それでnumpyを使いたいと思っている分析をすることができます。必須:パンダは人間の目を、numpyはコンピュータを意味します。 – gowrath

0

あなたが好きなネストされた辞書を生成を経由して、これを達成することができる:以下

{'Bob': {'Bob': .., 'Sarah': .., 'Ann': .., 'Jen':..} 
'Sarah': {.. .. ..}, 
'Ann': {.. .. ..}, 
'Jen': {.. .. ..}, 
} 

はサンプルコードです:あなたが形式でデータを得ることができる場合

>>> my_dict = {'Bob VS Sarah': {'shepherd': 1,'collie': 5,'poodle': 8}, 
... 'Bob VS Ann': {'shepherd': 3,'collie': 2,'poodle': 1}, 
... 'Bob VS Jen': {'shepherd': 3,'collie': 2,'poodle': 2}, 
... 'Sarah VS Bob': {'shepherd': 3,'collie': 2,'poodle': 4}, 
... 'Sarah VS Ann': {'shepherd': 4,'collie': 6,'poodle': 3}, 
... 'Sarah VS Jen': {'shepherd': 1,'collie': 5,'poodle': 8}, 
... 'Jen VS Bob': {'shepherd': 4,'collie': 8,'poodle': 1}, 
... 'Jen VS Sarah': {'shepherd': 7,'collie': 9,'poodle': 2}, 
... 'Jen VS Ann': {'shepherd': 3,'collie': 7,'poodle': 2}, 
... 'Ann VS Bob': {'shepherd': 6,'collie': 2,'poodle': 5}, 
... 'Ann VS Sarah': {'shepherd': 0,'collie': 2,'poodle': 4}, 
... 'Ann VS Jen': {'shepherd': 2,'collie': 8,'poodle': 2}, 
... 'Bob VS Bob': {'shepherd': 3,'collie': 2,'poodle': 2}, 
... 'Sarah VS Sarah': {'shepherd': 3,'collie': 2,'poodle': 2}, 
... 'Ann VS Ann': {'shepherd': 13,'collie': 2,'poodle': 4}, 
... 'Jen VS Jen': {'shepherd': 9,'collie': 7,'poodle': 2}} 
>>> new_dict = {} 
>>> for key, value in my_dict.iteritems(): 
...  first_name, second_name = map(lambda x: x.strip(), key.split('VS')) 
...  if first_name not in new_dict: 
...   new_dict[first_name] = {} 
...  new_dict[first_name][second_name] = value 
... 
>>> new_dict 
{'Sarah': {'Sarah': {'shepherd': 3, 'collie': 2, 'poodle': 2}, 
      'Ann': {'shepherd': 4, 'collie': 6, 'poodle': 3}, 
      'Jen': {'shepherd': 1, 'collie': 5, 'poodle': 8}, 
      'Bob': {'shepherd': 3, 'collie': 2, 'poodle': 4} 
      }, 
'Bob': {'Sarah': {'shepherd': 1, 'collie': 5, 'poodle': 8}, 
      'Bob': {'shepherd': 3, 'collie': 2, 'poodle': 2}, 
      'Jen': {'shepherd': 3, 'collie': 2, 'poodle': 2}, 
      'Ann': {'shepherd': 3, 'collie': 2, 'poodle': 1}}, 
'Jen': {'Sarah': {'shepherd': 7, 'collie': 9, 'poodle': 2}, 
      'Bob': {'shepherd': 4, 'collie': 8, 'poodle': 1}, 
      'Jen': {'shepherd': 9, 'collie': 7, 'poodle': 2}, 
      'Ann': {'shepherd': 3, 'collie': 7, 'poodle': 2} 
      }, 
'Ann': {'Sarah': {'shepherd': 0, 'collie': 2, 'poodle': 4}, 
        'Bob': {'shepherd': 6, 'collie': 2, 'poodle': 5}, 
        'Jen': {'shepherd': 2, 'collie': 8, 'poodle': 2},     
        'Ann': {'shepherd': 13, 'collie': 2, 'poodle': 4} 
     } 
} 
+1

説明なしでコードを書くのは避けてください。これは、人々が問題を解決するためのコードを提供されるだけのフォーラムではありません。 – gowrath

+0

また、defaultdictを使用し、 'new_dictではないif first_name_name'チェックを完全に避けることもできます。 – gowrath

関連する問題