【问题标题】:Cluster sizes in 2D numpy array?2D numpy 数组中的簇大小?
【发布时间】:2020-07-09 19:55:33
【问题描述】:

我有一个与before 已回答的问题类似的问题,稍作修改: 我有一个值为 -1,0,1 的二维 numpy 数组。我想找到值为 1 或 -1 的元素的簇大小(分别)。你对如何做到这一点有什么建议吗? 谢谢!

【问题讨论】:

    标签: python arrays numpy scipy cluster-computing


    【解决方案1】:

    您是否要计算二维数组中存在的 1 或 -1 的数量?

    如果是这样,那就相当容易了。说 ar = np.array([1, -1, 1, 0, -1])

    如果是这样,

     n_1 = sum([1 for each in ar if each==1]);
     n_m1 = sum([1 for each in ar if each==-1]) 
    

    【讨论】:

    • 感谢您的回复。这实际上不是我要解决的问题 - 我有一个二维数组,比如说 -1,0,1 值的随机排列。如果数组中的两个连通元素具有相同的值,我们就说这是一个大小为 2 的簇。例如:[1 0 0 0 \n 1 1 0 0 \n 0 0 0 0] 有一个大小为 3 的簇它,因为 3 个已连接。我想在我的数组中找到类型为 1 的集群和时间为 -1 的集群。
    • 你还想区分大小相同的簇的排列方式吗? [1 0 0 0 \n 1 1 0 0 \n 0 0 0 0] 的簇大小等同于 [1 1 1 0 \n 0 0 0 0 \n 0 0 0 0] 的大小,但它们的排列方式不同在二维数组中。
    • 我不介意安排,我只想要集群的大小。有一种使用我在最初问题中添加的参考来查找集群的好方法,但我无法弄清楚如何按类型(-1 或 1)区分不同的集群并忽略 0。感谢您抽出宝贵时间提供帮助!
    【解决方案2】:

    这是我的解决方案:

    import numpy as np
    import copy
    
    arr = np.array([[1,1,-1,0,1],[1,1,0,1,1],[0,1,0,1,0],[-1,-1,1,0,1]])
    print(arr)
    col, row = arr.shape
    mask_ = np.ma.make_mask(np.ones((col,row)))
    
    cluster_size = {}
    
    def find_neighbor(arr, mask, col_index, row_index):
        index_holder = []
    
        col, row = arr.shape
        left = (col_index, row_index-1)
        right = (col_index,row_index+1)
        top = (col_index-1,row_index)
        bottom = (col_index+1,row_index)
    
        left_ = row_index-1>=0
        right_ = (row_index+1)<row
        top_ = (col_index-1)>=0
        bottom_ = (col_index+1)<col
    
        #print(list(zip([left,right,top,bottom],[left_,right_,top_,bottom_])))
        for each in zip([left,right,top,bottom],[left_,right_,top_,bottom_]):
            if each[-1]:
                if arr[col_index,row_index]==arr[each[0][0],each[0][1]] and mask[each[0][0],each[0][1]]:
                    mask[each[0][0],each[0][1]] = False
                    index_holder.append(each[0])
    
        return mask,index_holder
    
    for i in range(col):
        for j in range(row):
            if mask_[i,j] == False:
                pass
            else:
                value = arr[i,j]
                mask_[i,j] = False
                index_to_check = [(i,j)]
                kk=1
                while len(index_to_check)!=0:
                    index_to_check_deepcopy = copy.deepcopy(index_to_check)
                    for each in index_to_check:
                        mask_, temp_index = find_neighbor(arr,mask_,each[0],each[1])
                        index_to_check = index_to_check + temp_index
                        # print("check",each,temp_index,index_to_check)
                        kk+=len(temp_index)
                    for each in index_to_check_deepcopy:
                        del(index_to_check[index_to_check.index(each)])
                if (value,kk) in cluster_size:
                    cluster_size[(value,kk)] = cluster_size[(value,kk)] + 1
                else:
                    cluster_size[(value,kk)] = 1
    print(cluster_size)
    

    cluster_size 是一个字典,键是两个成员元组 (a,b),a 给出集群的值(这就是您要解决的问题,对),b 给出该值的计数。每个键的值是簇的数量。

    【讨论】:

    • 哇!效果很好!我在想应该有某种方法来使用现有的聚类分析方法,但你的很棒!谢谢!
    猜你喜欢
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2013-06-26
    • 2016-06-13
    • 2019-02-27
    • 2019-03-02
    相关资源
    最近更新 更多