创建稀疏的coo_matrix并在两个for循环结构中进行更新

时间:2016-05-16 15:53:18

标签: python

在外部for循环中,我有k1作为x坐标,而在内循环中我有k2作为y坐标。循环基本上用于其他目的,即创建临时字典(用于其他目的)。所以,我无法删除循环结构。我正在尝试创建一个coo_matrix,其坐标为k1k2,其值为我在内循环中计算的值。

以下是我的简要代码:

for k1,v1 in s.iteritems():
    xdict[k1] = None
    for k2,v2 in s.iteritems():
        tempdict = {}
        if k2 in xdict.keys():
            continue
        if k1 == k2:
            continue
        tempdict[k1] = v1
        tempdict[k2] = v2
        r = reduce(set.intersection, (set(val) for val in tempdict.values()))
        new_kee = 'C(' + k1 + ',' + k2 + ')'
        ydict[new_kee] = len(r)

输入's'是一个包含以下示例键和值的字典:

216 [234]  
1305 [234, 234, 298, 429]  
2961 [241, 264]  
211 [143]  
....  

内部循环计算两个记录中每个记录的交集而不重复。在我的新词典中,交集结果的输出将被存储,例如:

c(216,1305) -> 1  
c(216,2961) -> 0  
c(216,211) -> 0  
c(1305,2961) -> 0  
c(1305,211) -> 0  
c(2961,211) -> 0  
...  

此时,我想将值存储在稀疏的coo_matrix中,其坐标如上所示:

  • 对于坐标(216,1305),将存储值1
  • 对于坐标(216,2961),将存储值0 等等....

我需要帮助创建坐标len(r)中值为(k1,k2)的稀疏coo_matrix。我不确定是否必须在具有固定大小的所有循环结构之前创建矩阵,然后在循环内或以任何其他方式更新。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

这是我怎么做的。定义两个函数:

def new_matrix(n,m):
    """Create a new matrix of dimensions 'n' by 'm'."""
    return [[0 for col in range(m)] for row in range(n)]

def update_matrix(matrix,row,col,val):
    """Update a matrix at row,col position with the value 'val'."""
    matrix[row][col] = val

按如下方式更新您的代码:

#You need to know the size ahead of time
#Replace row, col with appropriate dimensions
matrix = new_matrix(row,col)

for k1,v1 in s.iteritems():
    xdict[k1] = None
    for k2,v2 in s.iteritems():
        tempdict = {}
        if k2 in xdict.keys():
            continue
        if k1 == k2:
            continue
        tempdict[k1] = v1
        tempdict[k2] = v2
        r = reduce(set.intersection, (set(val) for val in tempdict.values()))
        new_kee = 'C(' + k1 + ',' + k2 + ')'
        ydict[new_kee] = len(r)

        #Update your matrix here:
        update_matrix(matrix,k1,k2,len(r))