Как я могу использовать numpy для эффективной работы с массивами? - PullRequest
0 голосов
/ 26 апреля 2020

Предположим, у меня есть массив со следующей формой:

array([[137, 138, 139, ..., 126, 126, 125],
       [139, 139, 139, ..., 126, 126, 126],
       [140, 140, 140, ..., 127, 126, 126],
       ...,
       [132, 135, 137, ..., 136, 135, 133],
       [133, 134, 136, ..., 136, 134, 133],
       [133, 134, 134, ..., 136, 134, 133]], dtype=uint8)

Моя цель - манипулировать массивом так, чтобы я мог преобразовать его в двоичный массив, где порог (например, 100) определяет, является ли запись равна 0 или 1.

Пока я только что реализовал вложенные циклы for, проверяющие строки и столбцы соответственно.

thres = 100

for k in range(0, len(my_array)):
    for i in range(0, len(my_array[0])):
        if(my_array[k][i] < thres):
            my_array[k][i] = 1
        else:
            my_array[k][i] = 0

Упоминается, что я не привязан ни к каким целям исполнения. Но просто из любопытства: как я могу эффективно использовать numpy, чтобы добиться лучшей производительности? Поскольку предоставленный массив может быть вычислен за разумное количество времени, вышеупомянутый подход работает просто отлично. Я могу представить, что с увеличением размера массива производительность подхода станет совершенно недостаточной.

1 Ответ

2 голосов
/ 26 апреля 2020

Как насчет

my_array[my_array < thresh] = 1
my_array[my_array > 1] = 0

или даже лучше, если вы не возражаете против истинного ложного

my_array <= thresh

или

my_array = (my_array < thresh).astype('uint8')

, если вы делаете.

Если вам нужно l oop в массиве, не используйте его. Они (намного) хуже, чем Python списки для этого - попробуйте это на своем примере и посмотрите, насколько это быстрее. Используйте список, если вы l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...