如何通过多维数组优化搜索和匹配?

时间:2019-07-16 22:41:14

标签: python arrays multidimensional-array

我正在尝试匹配2个不同数组中的元素。 Array_A是A_Clouds的3d地图,Array_B是B_Clouds的3d地图。每个“云”都是连续的,即任何孤立的像素都将定义一个新的云。像素的值是每个云的唯一唯一整数。非云值为0。这是一个2D示例:

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

我需要的输出只是与B_Cloud重叠的每个A_Cloud的ID(针对两个云),以及在这些云之间重叠的像素数(不需要的位置)。

问题在于它们都是非常大的3维数组(〜2000x2000x200,都具有相同的大小)。我基本上是在做一堆嵌套的for循环,这当然很慢。有没有更快的方法可以解决这个问题?提前致谢。

这就是我现在拥有的(简化为2d):

final_matches = []
for Acloud_id in ACloud_list:
    Acloud_locs = list(set([(i,j) for j, line in enumerate(Array_A) for i,pix in enumerate(line) if pix == Acloud_id]))

    matches = []
    for loc in Acloud_locs:
        Bcloud_pix = Array_B[loc[0]][loc[1]]
        if Bcloud_pix:
            matches.append(Bcloud_pix)

counter=collections.Counter(matches)
final_matches.append([Acloud_id, counter])

提前谢谢!

1 个答案:

答案 0 :(得分:0)

一些注意事项:

for Acloud_id in ACloud_list:
    Acloud_locs = list(set([(i,j) for j, line in enumerate(Array_A) for i,pix in enumerate(line) if pix == Acloud_id]))

如果我没看错的话,这需要检查数组中的每个像素以生成集合,并且对A中的每个云重复此操作。因此,如果您有500个云,则需要检查每个像素500次这将无法很好地扩展!

将重叠计数存储在字典中可能会更有效,并且只需遍历一次数组即可:

overlaps=dict()
for i in possible_x_coords: # define these however you like
    for j in possible_y_coords:
        if (Array_A[i][j] and Array_B[i][j]):
            overlaps[(Array_A[i][j],Array_B[i][j])] = 1 + overlaps.get((Array_A[i][j],Array_B[i][j]),0)

(对任何错误表示歉意,我在路上,无法测试我的代码)

更新:您已经澄清了数组稀疏约80%。如果该数字高得多,并且您可以控制输入的格式,那么我建议您研究稀疏数组格式-如果您的输入仅存储A的非零值,则可以避免麻烦检查A中的零值。但是,对于只有80%稀疏的东西,我不确定这会增加多少效率。