如何使用try-except计算numpy数组中的相邻单元格?

时间:2019-03-04 10:48:00

标签: python arrays python-3.x numpy neighbours

我有一个numpy数组:

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-except来达到上述目的?

2 个答案:

答案 0 :(得分:1)

这里的问题是numpy允许负索引。 a[-1]代表a中的最后一个值,这就是为什么数组中的第一个数字不减少的原因。

我认为您描述的第一种方法比try-except方法更干净,更快捷,您应该使用它。

答案 1 :(得分:1)

意识到index-1INDEX-1的索引在indexINDEX等于0时仍然有效,它们的值仅为-1,因此即使它们所引用的值与indexINDEX所引用的值不相邻,它们还是有效的数组索引。我的解决方法如下:

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]])