2012-03-03 17 views
2

2次元配列として表現された対称行列の下三角からdictを作成したいと思います。例えば、numpy配列が;python 2d配列からdict

array([[0, 2, 3], 
     [2, 0, 4], 
     [3, 4, 0]]) 

次に、私は辞書のように見えます。

{('1', '0'): 2, ('2', '0'): 3, ('2', '1'): 4} 

ベクターにも同様のポストがあります。

Fastest way to convert a Numpy array into a sparse dictionary?

私はとても感謝任意のヘルプ/ suggestoinsをPYTHONするのは比較的新しいです。

+4

これは意味がありません。 – wim

+0

oops、typo、correcテッド! –

答えて

6
>>> arr =[[0, 2, 3], 
      [2, 0, 4], 
      [3, 4, 0]] 
>>> dict(((j,i), arr[i][j]) for i in range(len(arr)) for j in range(len(arr[0])) if i<j) 
{(2, 0): 3, (1, 0): 2, (2, 1): 4} 
+0

最初の "for"の文法エラーが発生しました –

+0

@kap:Pythonはバージョン2.4より古いですか?ああ、待って。答えが編集されました。 – Frg

1

これを行う1つの方法は、ndenumeratedefaultdictです。

すべての位置に、それぞれの値をマッピングする辞書の構築:

>>> d = defaultdict(list) 
>>> for pos,val in numpy.ndenumerate(a): 
...  if val: 
...   d[val].append(pos[1]) 
... 
>>> d 
defaultdict(<class 'list'>, {2: [1, 0], 3: [2, 0], 4: [2, 1]}) 

をそして、キーと値を反転:

>>> {tuple(v):k for k,v in d.items()} 
{(2, 0): 3, (1, 0): 2, (2, 1): 4} 

あなたのPythonのバージョンは、辞書のcomprhensionをサポートしていない場合は、この最後の部分ができbe:

>>> dict((tuple(v),k) for k,v in d.iteritems()) 
{(2, 0): 3, (1, 0): 2, (2, 1): 4}