Как посчитать соседние ячейки в массиве с использованием try-кроме? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть пустой массив:

x = np.random.rand(4, 5)

Я хотел бы создать массив, показывающий, сколько соседних значений существует для каждого значения в исходном массиве .Под соседним я имею в виду:

example=np.array([[0,1,0,0,0],
                  [1,2,1,0,0],
                  [0,1,0,0,0],
                  [0,0,0,0,0]])

plt.imshow(example)

enter image description here

Значение в позиции [1][1] имеет 4 соседей (желтый квадрат имеет 4 смежные зеленые ячейки).

Решение, которое работает:

x = np.random.rand(4, 5)

mask = 4*np.ones(x.shape, dtype=int)

mask[0][:]=3
mask[-1][:]=3

for each in mask: each[0]=3
for each in mask: each[-1]=3

mask[0][0]=2
mask[0][-1]=2
mask[-1][0]=2
mask[-1][-1]=2

mask становится:

array([[2, 3, 3, 3, 2],
       [3, 4, 4, 4, 3],
       [3, 4, 4, 4, 3],
       [2, 3, 3, 3, 2]])

Теперь я пытаюсь создать тот же массив с try-except:

x = np.random.rand(4, 5)

numofneighbours=[]

for index, each in enumerate(x):    
    row=[]
    for INDEX, EACH in enumerate(each):

        c=4
        try:ap[index+1][INDEX]
        except:c-=1

        try:ap[index][INDEX+1]
        except:c-=1

        try:ap[index-1][INDEX]
        except:c-=1

        try:ap[index][INDEX-1]   
        except:c-=1

        row.append(c)

    numofneighbours.append(row)
numofneighbours=np.asarray(numofneighbours)

Задание результирующего массива numofneighbours:

array([[4, 4, 4, 4, 3],
       [4, 4, 4, 4, 3],
       [4, 4, 4, 4, 3],
       [3, 3, 3, 3, 2]])

, который не равен mask, как я ожидал.

Что такоеЯ делаю что-то не так, или как мне использовать try-кроме целей, описанных выше?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Понял, что индикаторы index-1 и INDEX-1 по-прежнему действительны, когда index и INDEX равны 0, они просто имеют значение -1, что делает его действительным индексом массива, даже если они являются значениемссылка на не соседствует со значением, на которое ссылаются index и INDEX.Мое исправление заключается в следующем:

x = np.random.rand(4, 5)

numofneighbours=[]

for index, each in enumerate(x):    
    row=[]
    for INDEX, EACH in enumerate(each):

        c=4
        try:x[index+1][INDEX]
        except:c-=1

        try:x[index][INDEX+1]
        except:c-=1

        try:x[index-1][INDEX]
        except:c-=1
        if (index-1)<0: c-=1

        try:x[index][INDEX-1]
        except:c-=1
        if (INDEX-1)<0: c-=1

        row.append(c)

    numofneighbours.append(row)
numofneighbours=np.asarray(numofneighbours)

Это дает:

array([[2, 3, 3, 3, 2],
       [3, 4, 4, 4, 3],
       [3, 4, 4, 4, 3],
       [2, 3, 3, 3, 2]])
0 голосов
/ 04 марта 2019

Проблема здесь в том, что numpy допускает отрицательную индексацию.a[-1] обозначает последнее значение в a, поэтому первые числа в вашем массиве не уменьшаются.

Я думаю, что первый описанный вами способ чище и быстрее, чем метод try-Кроме вас, и выследует просто использовать это.

...