在稀疏矩阵中查找非零块并执行此过程

时间:2015-03-18 23:51:28

标签: python numpy matrix scipy sparse-matrix

我有一个稀疏矩阵,它的大部分值都是零。 在此矩阵中,一些连续的行和列组是非零的。 为每个非零块分配一个ID。相同的ID最多只能分配给两个组。示例(见5和8):

         [8 8 0 0 0 0 0 0 0 0 0]
         [0 5 5 5 0 0 0 5 5 0 0]
         [0 0 5 5 0 3 0 5 0 0 8]
         [0 0 0 5 0 3 0 0 0 0 8]
         [0 0 0 2 4 4 0 0 0 0 8]
         [0 0 0 2 4 4 0 0 0 0 8]  

现在,问题是,如何将具有相同ID的组更改为不同的[新ID可以是任何内容]?输入矩阵是numpy矩阵。以下是上述矩阵的一个可能输出(“5”中的一个-id组更改为50,“8”-Id组更改为66):

         [66  66  0  0  0 0 0 0 0 0 0]
         [0   50  50 50 0 0 0 5 5 0 0]
         [0   0   50 50 0 3 0 5 0 0 8]
         [0   0   0  50 0 3 0 0 0 0 8]
         [0   0   0  2  4 4 0 0 0 0 8]
         [0   0   0  2  4 4 0 0 0 0 8] 

1 个答案:

答案 0 :(得分:1)

首先,我尝试通过扫描数组中的非零术语来构建字典。

scipy.sparse使用dok格式(键字典)执行此操作,其中键是具有i,j坐标的元组,值是数组值。但是出于这个问题的目的,我将值(5,8等)作为键,字典值将是坐标元组的列表。 collections.defaultdict可以快速完成此操作。

例如:

dd = {8:[(0,0),(0,1),(2,11),(3,11),...], 5:[(1,1),(1,2),...]}

然后我会扫描字典,并使用某种距离标准,分解列表

dd = {66:[(0,0),(0,1)], 8:[(2,11),(3,11)...], 55:[...], 5:[...]...}

我不认为有一种方法可以避免多次迭代数组。像这样的字典是一种收集和重新组合这样的数据的灵活方式。一旦更好地理解了问题,就可以直接使用数组。但第一步是获得工作代码。效率来得晚。