切片具有中心元素索引的子矩阵
Slice a submatrix with center element indices
给定一个矩阵 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])
如何高效优雅地做到这一点?谢谢
你的意思是这样的?
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
应该是奇数
对于子矩阵具有相同形状的情况,我们可以滑动 windows,然后使用沿着行和列的起始索引对它们进行索引以获得我们想要的输出。要获得这些 windows,我们可以利用 np.lib.stride_tricks.as_strided
based scikit-image's 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]
给定一个矩阵 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])
如何高效优雅地做到这一点?谢谢
你的意思是这样的?
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
应该是奇数
对于子矩阵具有相同形状的情况,我们可以滑动 windows,然后使用沿着行和列的起始索引对它们进行索引以获得我们想要的输出。要获得这些 windows,我们可以利用 np.lib.stride_tricks.as_strided
based scikit-image's 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]