Как определить / найти шаблон массива 1D в массиве 2D? - PullRequest
1 голос
/ 26 июня 2019

У меня есть двумерный массивный массив, и я пытаюсь найти записи, где он равен одномерному массиву, но размеры этих двух массивов запрещают вещание.В частности, мой 2D-массив имеет размер 300x400, и я хочу увидеть, где он равен вектору строки из 2 элементов [1, -1].

Я пытаюсь найти расположение пикселей на изображении, которые находятся на границесегментации.Это обозначено в этой маске 1 рядом с передним планом и -1 с фоном.Поэтому мне нужно найти места, где [1,-1] встречается в строках маски, скажем, a.

Я пробовал a == [1,-1], но это просто выполняет равенство на уровне объекта и возвращает False.

Полагаю, я мог бы сделать это с

for i in range(a.shape[0]): 
    for j in range(a.shape[1]-1): 
        if a[i,j] == 1: 
            if a[i,j+1] == -1: 
                print(i)

, но разве нет какого-нибудь милого способа сделать это с помощью метода numpy или чего-то еще?Ненавижу петли

Ответы [ 3 ]

1 голос
/ 26 июня 2019
arr = np.array([[1,1,-1],[1,-1,-1]])
arr_idx = (arr==1)[:,:-1] & (arr==-1)[:,1:]

Дает

>>> arr_idx
array([[False,  True],
       [ True, False]])

Что является индексом для вещей, которые соответствуют вашим критериям.Обратите внимание, что это формируется с одним меньшим количеством столбцов, чем ваша входная матрица (по очевидным причинам).

Вы можете добавить столбец с одной или другой стороны, чтобы изменить индексирование с любой стороны искомой пары.

arr_idx = np.concatenate((np.zeros(shape=(2, 1), dtype=bool), arr_idx), axis=1)
>>> arr_idx
array([[False, False,  True],
       [False,  True, False]])

Вставка нового столбца слева даетиндекс для компонента -1 пары.

0 голосов
/ 27 июня 2019

Проверка на 1, начиная с первого индекса (опускать последний, так как после него не может быть -1)

 tmp1 = a[:,0:-1]
 t1 = tmp1==1

t1 - Истина, где сдвиг a равен 1, Проверка -1 - начиная ссначала до последнего индекса

  tmp2 = a[:,1:]
  t2 = tmp2 ==-1

t1 и t2 содержат True и False (смещенные в соответствии с вашей целью) t1 * t2 даст вам True в строках, где ваше условие выполнено.Суммирование по строкам дает число выше нуля для каждого индекса строки i

res = np.sum(t1*t2,axis=1) 
desired_Indices = np.where(res>0)

... все ненавидят циклы;)

0 голосов
/ 26 июня 2019

Для этого вы можете использовать 2-мерную взаимную корреляцию.

Для этого есть функция scipy: signal.correlate2d ()

import numpy as np
from scipy import signal

arr = np.array([[1,1,-1],
                [1,-1,-1]])

# the pattern you are looking for, has to be 2d
krn = np.array([[1,-1]]) 

res = signal.correlate2d(arr, krn, mode='same')

print(res)

Результат

[[ 0  2 -1]
 [ 2  0 -1]]

чем выше, тем лучше матч. В вашем случае 2 указывает позиции, где находится ваш паттерн.

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