2015-04-08 6 views
1

У меня есть массив NumPy, состоящий только из 0 и 1 элементов следующим образом:Извлечение индексы массива NumPy

import numpy as np 
data = np.array([[1, 1 , 0 , 0 , 0 , 0 , 1 , 0], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 0], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 0], 
       [0, 0 , 1 , 1 , **1** , 1 , 1 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 1 , 1], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 0], 
       [1, 1 , 0 , 0 , 0 , 0 , 0 , 0]]) 

Я должен выяснить, индексы элемента 1, который окружен 1 в 2 на 2 пикселя в каждом направлении.

Местоположение ожидаемого ответа выделено жирным шрифтом.

Я ищу более легкий и быстрый способ сделать это.

ответ

2

Это легко с basic morphological operation:

import numpy as np 
from scipy.ndimage.morphology import binary_erosion 


data = np.array([[1, 1 , 0 , 0 , 0 , 0 , 1 , 0], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 0], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 1 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 1 , 1], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 0], 
       [1, 1 , 0 , 0 , 0 , 0 , 0 , 0]]) 

expected = np.array([[0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
        [0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
        [0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
        [0, 0 , 0 , 0 , 1 , 0 , 0 , 0], 
        [0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
        [0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
        [0, 0 , 0 , 0 , 0 , 0 , 0 , 0]]) 

# otherwise known as np.ones((5, 5)) 
structuring_element = np.array([[1, 1, 1, 1, 1], 
           [1, 1, 1, 1, 1], 
           [1, 1, 1, 1, 1], 
           [1, 1, 1, 1, 1], 
           [1, 1, 1, 1, 1]]) 

# will be of dtype np.bool but you can convert with .astype(np.int) 
# if you really need 
result = binary_erosion(data, structuring_element) 

print(result) 

print(np.allclose(result, expected)) 
3

Вы могли бы использовать некоторые signal processing -

import numpy as np 
from scipy import signal 

# Input 
data = np.array([[1, 1 , 0 , 0 , 0 , 0 , 1 , 0], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 0], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 1 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 1 , 1], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 0], 
       [1, 1 , 0 , 0 , 0 , 0 , 0 , 0]]) 

# Extent of the search   
extent = 2; 

# Kernel to be used with 2D convolution     
kernel = np.ones((2*extent+1,2*extent+1)) 

# Perform 2D convolution with input data and kernel 
filt_out = signal.convolve2d(data, kernel, boundary='symm', mode='same') 

# Find where the convolution resulted in a perfect score, 
# i.e is equal to the number of elements in kernel 
R,C = np.where(filt_out == kernel.size) 

выход -

In [66]: print(R,C) 
[3] [4] 

Перечислено в этом разделе альтернативный подход с ndimage для выполнения той же свертку, как и в предыдущем подходе, сохраняя остальные этапы. Вот код, чтобы получить выход свертка filt_out -

import scipy.ndimage 
filt_out = scipy.ndimage.convolve(data,kernel) 
+0

Спасибо за вашу попытку. Я поддержал. Тем не менее, я думал об этом, используя scipy.ndimage. Можете ли вы предложить мне альтернативный метод? –

+0

как maximum_filter, minimum_filter? –

+1

@EricBal Я не думаю, что здесь будет работать max или min filter, но этот фильтр будет искать максимальное значение в этом окне. Мы хотим, чтобы все элементы в этом окне были «отдельными». Итак, нам нужно суммировать все элементы внутри этого окна, поэтому здесь понадобится свертка. – Divakar

Смежные вопросы