Обработка двухмерного массива Python - PullRequest
0 голосов
/ 03 июля 2018

У меня есть входной массив вида

1 0 0 0 1
1 1 1 0 0
1 0 0 0 0
0 0 0 1 1
0 1 0 0 0

Я хочу вычислить карту плотности и получить выходные данные в форме (суммируя все значения вокруг значения, включая значение)

3 4 2 2 1
4 5 2 2 1
3 4 3 3 2
2 2 2 2 2
1 1 2 2 2

import numpy as np

def get_value(arr,i,j):
    """
    This function will return the value at the index if present. If list index out of range, it will return 0
    """
    try:
        return arr[i][j]
    except:
        return 0

#input array
arr = [[1, 0, 0, 0, 1],
 [1, 1, 1, 0, 0],
 [1, 0, 0, 0, 0],
 [0, 0, 0, 1, 1],
 [0, 1, 0, 0, 0]]

np_arr = np.array(arr) # converting to numpy array

r =1 # initializing the radius r as 1
n =5 # initializing the size of the input matrix as 5
np_arr_result = np.zeros(shape=(5,5)) # initializing the output array

for i in range(0,5):
    for j in range(0,5):
        np_arr_result[i][j] = get_value(np_arr,i,j) + get_value(np_arr,i-r,j-r) + get_value(np_arr,i-r,j)  + get_value(np_arr,i-r,j+r) + get_value(np_arr,i,j-r)  + get_value(np_arr, i, j+r) + get_value(np_arr, i+r, j-r) + get_value(np_arr, i+r, j) + get_value(np_arr, i+r, j+r)

print("output")
print(np_arr_result)

Однако я не получаю правильный вывод и получаю результат как:

output
[[ 5.  5.  3.  2.  1.]
 [ 5.  5.  2.  2.  1.]
 [ 4.  4.  3.  3.  2.]
 [ 3.  2.  2.  2.  2.]
 [ 2.  1.  2.  2.  2.]]

Что могло пойти не так?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Это потому, что для numpy индекс -1 относится к последнему элементу, поэтому он не будет утверждать IndexError.

просто измените функцию get_value() следующим образом:

def get_value(arr,i,j):
    """
    This function will return the value at the index if present. If list index out of range, it will return 0
    """
    if (i>-1 and j >-1 and i < arr.shape[0] and j < arr.shape[1]):
        return arr[i][j]
    else:
        return 0
0 голосов
/ 03 июля 2018

Это идеальная задача для двумерной свертки:

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

kernel = numpy.ones((3, 3), dtype=data.dtype)
# array([[1, 1, 1],
#        [1, 1, 1],
#        [1, 1, 1]])

scipy.signal.convolve2d(data, kernel, mode='same')
# array([[3, 4, 2, 2, 1],
#        [4, 5, 2, 2, 1],
#        [3, 4, 3, 3, 2],
#        [2, 2, 2, 2, 2],
#        [1, 1, 2, 2, 2]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...