Python:如何选择矩阵值的邻接邻居



我有一个矩阵,如下所示:

A = array([[12,  6, 14,  8,  4,  1],
[18, 13,  8, 10,  9, 19],
[ 8, 15,  6,  5,  6, 18],
[ 3,  0,  2, 14, 13, 12],
[ 4,  4,  5, 19,  0, 14],
[16,  8,  7,  7, 11,  0],
[ 3, 11,  2, 19, 11,  5],
[ 4,  2,  1,  9, 12, 12]])

对于每个单元格,我想选择k=2最接近单元格的radius中的值。

例如,如果我选择A[3,4],我想要一个子矩阵,如下面的

array([[18, 13,  8, 10,  9],
[ 8, 15,  6,  5,  6],
[ 3,  0,  2, 14, 13],
[ 4,  4,  5, 19,  0],
[16,  8,  7,  7, 11]])

我定义了以下功能

def queen_neighbourhood(Adj, in_row, in_col, k):
j=k
k+=1
neighbourhood = Adj[in_row-j:in_row+k, in_col-j:in_col+k]
return neighbourhood

queen_neighbourhood(A, 3, 2, 2)返回

array([[18, 13,  8, 10,  9],
[ 8, 15,  6,  5,  6],
[ 3,  0,  2, 14, 13],
[ 4,  4,  5, 19,  0],
[16,  8,  7,  7, 11]])

然而,它在边境地区不起作用。

例如,对于小区[0,0],我想要

array([[12, 6,  14],
[18, 13,  8],
[ 8, 15, 16])

但它返回queen_neighbourhood(A, 0, 0, 2)

array([], shape=(0, 0), dtype=int64)

您可以避免负指数:

neighbourhood = Adj[max(in_row-j, 0) : in_row+k,
max(in_col-j, 0) : in_col+k]

添加到上一个答案;考虑的极值

def queen_neighbourhood(Adj, in_row, in_col, k):
j=k
k+=1
neighbourhood = Adj[max(in_row-j, 0) : min(in_row+k,Adj.shape[0]),
max(in_col-j, 0) : min(in_col+k,Adj.shape[1])]
return(neighbourhood)

您可以使用numpy roll来确保始终处理中间值

import numpy as np
def queen_neighbourhood(Adj, in_row, in_col, k):
j=k
k+=1
midrow = int(Adj.shape[0]/2.)+1
midcol = int(Adj.shape[1]/2.)+1
Ashift = np.roll(Adj,(in_row-midrow,in_col-midcol),(0,1))
neighbourhood = Ashift[1:k+1, 1:k+1]
return neighbourhood

A = np.array([[18, 13,  8, 10,  9],
[ 8, 15,  6,  5,  6],
[ 3,  0,  2, 14, 13],
[ 4,  4,  5, 19,  0],
[16,  8,  7,  7, 11]])
print(A)
An = queen_neighbourhood(A, 0, 0, 2)
print(An)

它给出

[[11 16  8]
[ 9 18 13]
[ 6  8 15]]

最新更新