Для ввода с типом данных uint16
, numpy.bincount
должно работать хорошо:
hist = np.bincount(source.ravel(), minlength=2**16)
Ваша функция делает почти то же, что bincount
, но bincount
реализовано в C.
Например, следующие проверки проверяют, что использование bincount
дает тот же результат, что и ваша calc_hist
функция:
In [159]: rng = np.random.default_rng()
In [160]: x = rng.integers(0, 2**16, size=(1000, 1000))
In [161]: h1 = calc_hist(x)
In [162]: h2 = np.bincount(x.ravel(), minlength=2**16)
In [163]: (h1 == h2).all() # Verify that they are the same.
Out[163]: True
Проверьте производительность с помощью команды i python %timeit
. Вы можете видеть, что использование bincount
намного быстрее .
In [164]: %timeit calc_hist(x)
2.66 s ± 21.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [165]: %timeit np.bincount(x.ravel(), minlength=2**16)
3.13 ms ± 100 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)