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

问题描述 投票:0回答:2

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

例如:

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

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

python numpy numpy-ndarray numpy-broadcasting numpy-slicing
2个回答
2
投票

您的意思是这样的?

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在这里应该是奇数


0
投票

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

scikit-image's view_as_windows
© www.soinside.com 2019 - 2024. All rights reserved.