2015-02-15 2 views
-2

Я хочу отфильтровать индексы, след (3,3) состоит из 1s.Извлечение элементов, соответствующих фильтру

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

Ожидаемый ответ ниже, нежелательные позиции устанавливаются 0s:

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

ответ

3

Я основывая этот ответ на a very similar answer я написал всего несколько часов назад.

#from sklearn.feature_extraction.image import extract_patches # similar to numpy's stride_tricks 
from numpy.lib.stride_tricks import as_strided 

data = np.array([[1, 1 , 0 , 0 , 0 , 0 , 1 , 0], 
       [1, 1 , 1 , 0 , 0 , 1 , 1 , 0], 
       [1, 1 , 1 , 1 , 1 , 0 , 0 , 0], 
       [0, 0 , 1 , 1 , 1 , 0 , 0 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 0 , 1], 
       [1, 1 , 0 , 0 , 0 , 1 , 1 , 1], 
       [1, 1 , 0 , 0 , 0 , 1 , 1 , 1]]) 
patches = as_strided(data, shape=(data.shape[0]-2,data.shape[1]-2, 3, 3), strides=data.strides*2) 
dual = patches.all(axis=-1).all(axis=-1) 
patches[dual==False] = 0 
patches[dual] = 1 

Результат (в data) как вы показали.

Как это работает следующим образом: функция extract_patches генерирует вид в массив data, что означает, что не копия фактических данных, но использует шагает для создания, казалось бы, разные массив. В этом случае он будет генерировать все возможные подматрицы 3x3 (которые могут перекрываться) массива data. Затем, написав patches.all(axis=-1).all(axis=-1), вы сначала проверяете, все ли элементы в строках подматриц True (или эквивалент True в логическом смысле, а не 0, пустые списки, пустые словари, пустые кортежи и несколько других особых случаев), тем самым сворачивая одну из осей этого массива, а затем со вторым .all(axis=-1) столбцы проверяются, чтобы проверить, все ли они True.

Небольшой пример этого пункта уточнить визуально:

>>> A = np.array([ 
... [1, 1, 0],  # -> along this row, not all elements are 1: so `all` along the last axis will return False 
... [1, 1, 1],  # -> along this row, all elements are 1: so `all` along the last axis (axis=-1) will return True 
... [1, 1, 1]]) 
>>> A.all(axis=-1) 
array([False, True, True], dtype=bool) # so it is done along the last axis, along the rows 
>>> A.all(axis=-1).all(axis=-1) 
False 

Так этот массив dual теперь имеет «1» (True фактически) для каждого 3х3 подматрицы, которая была полна тех. Однако эти подматрицы перекрываются, поэтому сначала вы хотите установить все патчи на 0, когда каждая из этих подматриц 3x3 была не все (это одна из последних строк в первом кодовом блоке: patches[dual==False] = 0) и , а затем вы можете снова примените их в каждой подматрице 3x3, изначально имевшей все. Альтернативы должны соотносяться с kernel = np.ones((3,3)) или принимать во внимание несколько побитовых операций (как и в другом ответе), но этот последний метод становится очень трудным для записи, когда размеры массива превышают просто (2,2).

+2

@simen, учитывая ссылки, на которые вы ссылаетесь, я думаю, что вы также являетесь пользователем «мускуса» (из вопроса, который я связал). Если это так, вы можете попросить одного из модераторов Stackoverflow объединить ваши учетные записи. В любом случае оба вопроса, на которые вы ссылаетесь, принимаются. Если они не сделали то, что вы хотите, вы должны более подробно объяснить, почему ответы не делают то, что вы хотели. Аналогичная ситуация здесь: можете ли вы объяснить, что добросовестный ответ не делает * точно * то, что вы просили в своем * оригинальном сообщении *? –

+0

Меня больше не интересует вопрос, используя sklearn. Я ищу способ решения этой проблемы в ответах, которые я рассказал выше. – Borys

+0

Ссылки уже связаны с этим вопросом, и я знаком с вашим ответом на мускуса пользователя, потому что этот вопрос также связан с моим вопросом. – Borys