Получить индексы соседних элементов в радиусе - PullRequest
1 голос
/ 27 мая 2019

У меня есть матрица NxN, и я хочу найти индексы (или хотя бы число) ненулевых элементов в радиусе R для каждого элемента в матрице. Матрица будет большой, поэтому я планирую выполнять вычисления с использованием Numpy, и мне нужны индексы, потому что эта матрица связана с другой с хранилищем данных (которое представляет собой список [[]] объектов Python).

Матрица выглядит так:

Matrix

где зеленый - выделенная ячейка, желтый - окружающая область.

Основная проблема - движущийся трафарет, либо в цикле, либо в векторизации.

Я попробовал следующий код, который дает правильные координаты (все в пределах радиуса и исключая центр) относительно точки, но я не знаю, как применить его к массиву numpy:

r = 2
neighbor_coords = []
for i in list(itertools.product(range(-r, r+1), repeat=2)):
    if any(i) and np.sqrt(i[0]**2 + i[1]**2) <= r:
        neighbor_coords.append(i)

>>> [(-2, 0), (-1, -1), (-1, 0), (-1, 1), (0, -2), (0, -1), (0, 1), (0, 2), (1, -1), (1, 0), (1, 1), (2, 0)]

Ожидаемый результат - индексы или количество соседних элементов.

Ответы [ 2 ]

1 голос
/ 27 мая 2019
>>> def find_ind(array,center,radius):
...     a = np.indices(array.shape).reshape(2,-1).T
...     return a[np.abs(a-np.array(center)).sum(1)<=int(radius)]-np.array(center)
...
>>> find_ind(np.zeros((7,7)),[4,4],2)
array([[-2,  0],
       [-1, -1],
       [-1,  0],
       [-1,  1],
       [ 0, -2],
       [ 0, -1],
       [ 0,  0],
       [ 0,  1],
       [ 0,  2],
       [ 1, -1],
       [ 1,  0],
       [ 1,  1],
       [ 2,  0]])

Конечно, вы можете ввести сам массив в функцию

1 голос
/ 27 мая 2019

Это может помочь вам отойти оттуда.Вы можете использовать функцию convolve в scipy, чтобы свернуть вашу матрицу с ядром, которое вы генерируете.Это ниже будет считать ненулевые записи в пределах досягаемости ядра.Обратите внимание, что я преобразовал входную матрицу в единицу, чтобы она суммировала ненулевые местоположения, а не значения.

In [74]: import numpy as np                                                     

In [75]: from scipy.ndimage.filters import *                                    

In [76]: a                                                                      
Out[76]: 
array([[1, 2, 0, 0],
       [1, 1, 0, 0],
       [0, 0, 0, 0],
       [5, 5, 5, 5]])

In [77]: a_ones = np.where(a>0, 1, 0)                                           

In [78]: a_ones                                                                 
Out[78]: 
array([[1, 1, 0, 0],
       [1, 1, 0, 0],
       [0, 0, 0, 0],
       [1, 1, 1, 1]])

In [79]: k                                                                      
Out[79]: 
array([[0, 1, 0],
       [1, 0, 1],
       [0, 1, 0]])

In [80]: convolve(a_ones, k, mode='constant')                                   
Out[80]: 
array([[2, 2, 1, 0],
       [2, 2, 1, 0],
       [2, 2, 1, 1],
       [1, 2, 2, 1]])

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