切片具有中心元素索引的子矩阵

给出矩阵A,行索引列表和列索引列表,如何有效地提取以行索引和列索引为中心的大小为k的平方子矩阵?

例如:

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

输出应为A[1:4,2:5]A[4:7,1:4]。因此,基本上,输出是大小为kxk的平方子矩阵,并以[r,c]元素(在这种情况下为A [2,3]和A [5,2])为中心

如何高效而优雅地做到这一点?谢谢

Yushujun 回答:切片具有中心元素索引的子矩阵

您的意思是这样的吗?

for x,y in zip(r,c):
    s = k // 2
    print("position:",[x - s,x + s + 1],[y - s,y + s + 1])
    print(A[x - s:x + s + 1,y - s:y + s + 1])
    print()

输出:

position: [1,4] [2,5]
[[ 8 10  9]
 [ 6  5  6]
 [ 2 14 13]]

position: [4,7] [1,4]
[[ 4  5 19]
 [ 8  7  7]
 [11  2 19]]

请注意,k在这里应该是奇怪的

,

对于子矩阵具有相同形状的情况,我们可以获取滑动窗口,然后将这些索引的起始索引沿行和列索引以得到所需的输出。要获得这些窗口,我们可以利用基于np.lib.stride_tricks.as_stridedscikit-image's view_as_windowsMore info on use of as_strided based view_as_windows-

from skimage.util.shape import view_as_windows

# Get all sliding windows
w = view_as_windows(A,(k,k))

# Select relevant ones for final o/p
out = w[r-k//2,c-k//2]
本文链接:https://www.f2er.com/3155112.html

大家都在问