我有一個如下矩陣:
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]])
對于每個單元格,我想選擇最近單元格中radius的值。k=2
例如,如果我選擇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)
uj5u.com熱心網友回復:
您可以避免負指數:
neighbourhood = Adj[max(in_row-j, 0) : in_row k,
max(in_col-j, 0) : in_col k]
uj5u.com熱心網友回復:
添加到上一個答案;考慮到極值
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)
uj5u.com熱心網友回復:
您可以使用 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]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454655.html
