Подсчет вхождений целых чисел в движущемся окне на двумерном массиве NumPy - PullRequest
0 голосов
/ 10 октября 2019

Я хотел бы рассчитать по целому числу, как часто это значение встречается в движущемся окне. Однако я понятия не имею, как с этим справиться, так как я могу найти только то, как рассчитать среднее значение.

Таким образом, окно имеет размер:

kernel =array([[1, 1, 1],
               [1, 1, 1],
               [1, 1, 1]])

Входные данные:

input = array([[3, 3, 2, 3],
               [3, 1, 2, 3],
               [2, 1, 1, 1],
               [3, 1, 3, 2]])

Вывод должен выглядеть следующим образом: Первый «слой» отсчитывает 1Второй счетчик «слоя» 2 и т. Д.

output = array([[[1, 1, 1, 0],
                 [2, 3, 4, 2],
                 [3, 4, 5, 3],
                 [2, 3, 4, 2]],
                [[0, 2, 2, 0],
                 [1, 3, 2, 2],
                 [1, 2, 2, 2],
                 [1, 1, 1, 1]],
                [[3, 3, 3, 2],
                 [3, 3, 3, 2],
                 [2, 3, 2, 2],
                 [1, 2, 1, 1]]])

Выходные данные должны быть трехмерным массивом. x, y размеры исходного массива, а z количество уникальных целых чисел. Каждый слой показывает количество на уникальное целое число.

если у вас есть какие-либо указания, как решить эту проблему, это было бы замечательно.

1 Ответ

0 голосов
/ 22 октября 2019
import numpy as np

def focal_lcz_count(image, window_w, window_h, int_val):

    w, h = image.shape
    count_arr = np.zeros([w, h])
    for i in range(w):
        for j in range(h):
            window = image[i:i+window_w, j:j+window_h]
            np.zeros([w, h])
            count_arr[i,j] = np.count_nonzero(window == int_val)

    return count_arr


def list_focal_count(input_array,integer_list, window_size):

    count_list = []
    for i, item in enumerate(integer_list):
        count_out = focal_lcz_count(image=input_array, window_w=window_size, window_h=window_size, int_val=item)
        count_out = count_out.flatten()
        count_list.append(count_out)
        raster_array = np.asarray(count_list)

    return count_list


input = np.random.randint(1, 4, ( 8, 8))
integ_list= [1,2,3]

result = list_focal_count(input_array=input,integer_list=integ_list, window_size=3)
print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...