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