подсчитать количество элементов в несбалансированном массиве 4D numpy - PullRequest
0 голосов
/ 09 июля 2020

У меня есть массив NumPy (1513,256,256,1), который фактически содержит 1513 серых изображений с размером (256,256). Каждое изображение содержит 4 класса (значения 0,1,2,3). 0 означает фон. Но значения не являются целыми числами, они равны 32. Я хочу подсчитать количество пикселей или элементов, принадлежащих каждому классу. Данные несбалансированы, поэтому я пытаюсь их сбалансировать. Я пробовал несколько методов, но они не работали. Во-первых, числа не целые, поэтому они принадлежат нескольким классам, а не только 4 классам. Кто-нибудь знает, как получить количество элементов каждого класса?

Я использовал здесь этот код, но он не сработал.

y_integers = np.argmax(masks, axis=1)
class_weights = compute_class_weight('balanced', np.unique(y_integers), y_integers)
d_class_weights = dict(enumerate(class_weights))

1 Ответ

0 голосов
/ 09 июля 2020

Вместо проверки равенства вы можете искать значения i в интервале [i-0.5, i+0.5]. Это будет справляться с плавающими данными, и вы сможете довольно легко выполнить свою задачу, используя numpy .histogram . Вот небольшой код:

import numpy as np

n, h, w = 10, 255, 255
arr = np.random.randint(0,4,(n,h,w,1)).astype('float')
counts = np.zeros((n, 4), dtype='int')
for i in range(n):
  counts[i] = np.histogram(arr[i].ravel(), bins=[-0.5, 0.5, 1.5, 2.5, 3.5])[0]

print('counts:\n', counts)

Вывод:

% python3 script.py
counts:
 [[16110 16041 16464 16410]
 [16258 16112 16397 16258]
 [16328 16270 16121 16306]
 [16142 16315 16330 16238]
 [16264 16269 16237 16255]
 [16159 16338 16224 16304]
 [16198 16285 16204 16338]
 [16298 16270 16381 16076]
 [16230 16281 16336 16178]
 [16385 16320 16198 16122]]

Обратите внимание, что каждая из строк должна давать в сумме 256*256. Вы также можете изменить bins=[-0.5, 0.5, 1.5, 2.5, 3.5] в зависимости от ваших данных.

Если вы хотите сбалансировать значения, ваша проблема называется выравниванием гистограммы. Здесь - это вопрос, который вы, возможно, сможете адаптировать для решения вашей проблемы.

...