У меня есть двумерный массивный массив, и я пытаюсь найти записи, в которых он равен одномерному массиву, но размеры этих двух массивов запрещают вещание. В частности, мой 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 или чего-то еще? Я ненавижу петли

1
chimm 26 Июн 2019 в 19:12

3 ответа

Лучший ответ

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

Для этого есть функция 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 указывает позиции, где находится ваш паттерн.

0
Joe 30 Июн 2019 в 06:26
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 пары.

1
CJR 26 Июн 2019 в 16:29

Проверьте на 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 в строках, где ваше условие выполнено. Суммирование по строкам дает вам число выше нуля для каждого индекса строки я

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

... все ненавидят петли;)

0
Woma 26 Июн 2019 в 21:35