Эффективный способ найти режим в большой 2D матрице в Python (Scipy) - PullRequest
0 голосов
/ 29 июня 2018

Я использую stats.mode () из scipy для расчета режима в матрице 800 * 500 . И время выполнения выглядит так:

   `Time taken to execute 0.4359015187888584
    Time taken to execute 0.42199154405135975
    Time taken to execute 0.4250416821138656
    Time taken to execute 0.4100701556064723
    Time taken to execute 0.4371956395342953`

Но мне это нужно под:

 Excution time 0.09193338154885265

Есть ли способ сделать его эффективным?

1 Ответ

0 голосов
/ 29 июня 2018

Понятия не имею, почему 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...