Замена указанных c значений массива 2d numpy, но только по краям - PullRequest
0 голосов
/ 23 марта 2020

Чтобы проиллюстрировать мою точку зрения, давайте возьмем этот массив 2d numpy:

array([[1, 1, 5, 1, 1, 5, 4, 1],
       [1, 5, 6, 1, 5, 4, 1, 1],
       [5, 1, 5, 6, 1, 1, 1, 1]])

Я хочу заменить значение 1 другим значением, скажем 0, но только по краям. Это желаемый результат:

array([[0, 0, 5, 1, 1, 5, 4, 0],
       [0, 5, 6, 1, 5, 4, 0, 0],
       [5, 1, 5, 6, 0, 0, 0, 0]])

Обратите внимание, что единицы, окруженные другими значениями, не изменяются.

Я мог бы реализовать это, перебирая все строки и элементы, но я чувствую, что было бы очень неэффективно. Обычно я бы использовал функцию np.where для замены определенного c значения, но я не думаю, что вы можете добавить позиционные условия?

1 Ответ

2 голосов
/ 23 марта 2020
m = row!=1   
w1 = m.argmax()-1
w2 = m.size - m[::-1].argmax()

Эти три строки дадут вам индекс для трейлинга. Идея была взята из конечных нулей.

Попробуйте:

arr = np.array([[1, 1, 5, 1, 1, 5, 4, 1],
       [1, 5, 6, 1, 5, 4, 1, 1],
       [5, 1, 5, 6, 1, 1, 1, 1]])

for row in arr:
    m = row!=1

    w1 = m.argmax()-1
    w2 = m.size - m[::-1].argmax()
#     print(w1, w2)
    row[0:w1+1] = 0
    row[w2:] = 0
#     print(row)

обр .:

array([[0, 0, 5, 1, 1, 5, 4, 0],
       [0, 5, 6, 1, 5, 4, 0, 0],
       [5, 1, 5, 6, 0, 0, 0, 0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...