2012-03-03 154 views
2

我想從一個對稱矩陣的下三角形創建一個字典,表示爲2d數組。例如,如果numpy數組是;python二維數組字典

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。

+4

這沒有任何意義.. – wim 2012-03-03 10:00:57

+0

oops對於錯字,correc泰德! – 2012-03-03 10:18:52

回答

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」處得到語法錯誤 – 2012-03-03 10:19:45

+0

@kap:您是Python比版本2.4舊嗎?啊,等等。答案已被編輯。 – Frg 2012-03-03 11:34:28

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,這最後一部分可能是:

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