Размеры кластера в 2D numpy массиве? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть вопрос, похожий на тот, на который уже был дан ответ до , с небольшими изменениями: у меня есть массив 2-D numpy со значениями -1,0,1. Я хочу найти размеры кластеров элементов со значениями 1 или -1 (отдельно). Есть ли у вас какие-либо предложения о том, как это сделать? Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Это мое решение:

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), задающий значение кластера (это то, что вы хотите решить, справа), b дает счетчики этого значения. Значением для каждого ключа является номер кластера.

0 голосов
/ 29 марта 2020

Вы пытаетесь подсчитать число 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]) 
...