【发布时间】:2019-11-06 03:33:48
【问题描述】:
给定一个矩阵 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])
如何高效而优雅地做到这一点?谢谢
【问题讨论】:
-
我认为没有什么特别的技巧。对于
r和c中的每一对值,确定相关的切片(只是一些基本的数学运算),然后进行切片。 -
是的,当然可以。但是如果 r 和 c 的长度非常大,那么逐个循环遍历每个 case 可能会很慢。
-
这是
viewing数组作为一堆(可能重叠)窗口的一种方式。您可以从中选择一个子集。它使用as_strided函数。它很有效,但有点难以理解和正确操作。 -
那么,所有子矩阵的形状都一样吗?
标签: python numpy numpy-ndarray array-broadcasting numpy-slicing