我有一个稀疏矩阵,它的大部分值都是零。 在此矩阵中,一些连续的行和列组是非零的。 为每个非零块分配一个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]
答案 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:[...]...}
我不认为有一种方法可以避免多次迭代数组。像这样的字典是一种收集和重新组合这样的数据的灵活方式。一旦更好地理解了问题,就可以直接使用数组。但第一步是获得工作代码。效率来得晚。