Понятия не имею, почему scipy.stats.mode
такой медленный. В любом случае, вы можете получить гораздо более быстрый результат, используя np.bincount
:
# create random frame
>>> a = np.random.randint(0, 256, (800, 500)).astype(np.int8)
>>>
# add row offsets to make bincount create separate bins for each row
>>> counts = np.bincount((a.view(np.uint8) + 256 * np.arange(800)[:, None]).ravel(), minlength=256*800).reshape(800, 256)
# find the mode
>>> values = np.argmax(counts, axis=1)
# discard the counts for all other values
>>> counts = counts[np.arange(800), values]
# convert modes back to original dtype
>>> values = values.astype(np.uint8).view(np.int8)