如何设置具有复杂嵌套元组列表的矩阵

时间:2014-02-07 18:20:20

标签: for-loop numpy matrix group-by tuples

我有一个嵌套的tupled列表,看起来像这样

nested_ls =   [[(0, (0, 0)), (1, (1, 1)), (2, (2, 2)), (1, (1, 3))], [(3, (3, 3)), (2, (2, 4)), (4, (4, 0)), (3, (3, 1))], [(3, (3, 5)), (2, (2, 6)), (3, (3, 7)), (3, (3, 8))]]

我希望用每个元组中的两个项设置矩阵“m”;第一项item1是外元组[[(item1(0,0)),(item1(1,1)] [....(item1(3,5))....]中的每一项。 ..]和第二项item2在每个内元组的索引位置[1]上,例如(3(3,item2))。

我尝试使用groupby迭代器循环,如下所示:

from numpy  import *
from itertools import groupby
     for i,j in groupby(nested_ls, lambda x: x):
      for j in i:
          print j # item1 in outer tuple
          l = j[1] # inner tuple
          m[i,j] = i[j-1][1],i[j][1]] +=1 #matrice m, [j-1] is to get item1 in outer tuple
      return m                             
                                        # and i[j][1] is to get indexposition [1] in inner tuple

生成的矩阵看起来应该像

[0 1 0 0 1]
[0 1 1 0 1]
[0 0 0 1 0]

其中每个1代表nested_ls中item1 * item2的出现。

            inner tuple, item2
             0  1 2 3 4 5 6 7 8
   outer   0 [1 0 0 0 0 0 0 0 0]
   tuple   1 [0 1 0 1 0 0 0 0 0]
   item1   2 [0 0 1 0 0 0 1 0 0]
           3 [0 1 0 1 0 1 0 1 1]
           4 [0 0 0 0 1 0 0 0 0]

1 个答案:

答案 0 :(得分:3)

听起来您想要创建一个二维数组,其中每个1值对应于nested_ls结构中给出的坐标。您可以使用以下代码执行此操作:

nested_ls =   [
[(0, (0, 0)), (1, (1, 1)), (2, (2, 2)), (1, (1, 3))],
[(3, (3, 3)), (2, (2, 4)), (4, (4, 0)), (3, (3, 1))],
[(3, (3, 5)), (2, (2, 6)), (3, (3, 7)), (3, (3, 8))]
]

#extract coordinates from nested structure
coordinates = [(a, c) for l in nested_ls for a, (b, c) in l]

#construct empty matrix.
width  = 1 + max(c for a,c in coordinates)
height = 1 + max(a for a,c in coordinates)
matrix = [[0 for x in range(width)] for y in range(height)]

#populate matrix
for a, c in coordinates:
    matrix[a][c] += 1

#display matrix
for row in matrix:
    print row

(抱歉,我使用普通列表而不是numpy矩阵 - 我没有安装该库。但我认为基本原理是相同的。)

结果:

[1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 1, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 1, 0, 1, 0, 0]
[0, 1, 0, 1, 0, 1, 0, 1, 1]
[1, 0, 0, 0, 0, 0, 0, 0, 0]