我需要在矩阵中聚集所有数字(在一个簇中可以是具有相同值的数字,例如只有5),而不是传递和返回字典,如
{number1:[[(3,4),(4,5)],[]..], number2:...}#I am using Python
我可以遍历行和列,当我发现数字不同于传递的数字x时,我开始填充并创建聚类并记住访问位置,以避免双重相同的聚类,并且它可以工作。我想知道有没有人有更好的想法,更快?
FOR例子(我想聚集所有不同于1的数字) 通过值1
2 1 1 2
2 1 2 2
1 1 3 3
我会得到{2:[(0,0),(1,0)],[(0,3),(1,2)(1,3)],3:[(2,2) ,(2,3)]}
答案 0 :(得分:1)
让我们将单元格值分类为target value
和replacement value(s)
,其中target value
的单元格是您要修改的单元格。您想要使用replacement value(s)
对其进行聚类。在您的示例中,这些值分别为1和(2,3)。
洪水填充的一个常见应用是,将replacement value(s)
的单元格更改为target value
的单元格,例如油漆应用中的桶填充工具。如果这是您的用例,您可以在每次访问单元格时更改单元格值,从而无需记住您之前是否访问过该单元格。我假设那不是你的用例。
方法#1:使用字典
我会使用带有访问单元格的(row,col)字典作为键。既然你想看看你是否访问过(row,col),你可以用O(1)时间复杂度来做。您的方法需要首先转到特定的replacement value
键,然后遍历列表以查找(当前行,当前col)是否存在于其中。它的时间复杂度与O(k)成正比,其中k是列表中元素的数量。在最坏的情况下,它将是O(RxC),其中RxC是矩阵的维数。
方法#2:使用bool矩阵
另一种简单的方法是使用类型为bool的矩阵,其尺寸与单元格值矩阵相同。每次访问单元格时,请将其标记为True。您可以在O(1)中检查是否已访问过某个单元格。
在最坏的情况下,上述两种数据结构都具有O(RxC)的空间复杂度。我假设这很好,因为你已经有一个单元格值相同的矩阵。
答案 1 :(得分:1)
您是否考虑过使用numpy.where()?如果您可以将数据放入数组中,则只需使用:
import numpy as np
data=np.array(<some data>)
np.where(data!=2)
获取不等于2的元素的indeces。就此而言,numpy数组的工作与直接比较,如
data > 5
将返回比较为真的布尔数组,并且:
data[data > 5]
将返回比较为true的值,这样您甚至可能不需要numpy.where()。