我有一个关于访问实际上不存在的矩阵位置的问题。
首先,我有一个包含行行和 cols 列的矩阵。从这个矩阵,我必须得到 n x n 子矩阵的集合。例如,要获得3 x 3个子矩阵,我会执行以下操作:
for x, y in product(range(1, matrix.rows-1), range(1, matrix.cols-1)):
bootstrap_3x3 = npr.choice(matrix.data[x-1:x+2, y-1:y+2].flatten(), size=(3, 3), replace=True)
但是,可以看出,我没有考虑到极端,我必须这样做。例如,对于x = 0和y = 0,我应该考虑matrix.data[x:x+2, y:y+2]
(中心应该是当前的x和y),返回3 x 3
,第一行/列= 0。
我知道我可以通过一些 if 语句实现这一点。但我想Python应该有一个聪明的方法来正确地做到这一点。
提前谢谢。
答案 0 :(得分:0)
我会创建一个新的矩阵,在其周围填充(n-1)/2
个零:
import numpy as np
rows, cols = 4, 6
n = 3
d = (n-1)/2
data = np.arange(rows*cols).reshape(rows, cols)
padded = np.pad(data, d, mode='constant')
for x, y in np.indices(data.shape).reshape(2, -1).T:
sub = padded[x:x+n, y:y+n]
print sub
bootstrap_nxn = np.random.choice(sub.ravel(), (n, n))
这假定n
是奇数,并且子矩阵 center 始终在原始data
矩阵内。如果n
为偶数,则子矩阵的 center 定义不明确。
如果你真的想让子矩阵与只有一行的数据矩阵重叠,那么你需要填充n-1
个零(在这种情况下甚至与奇数n
赢了'重要)。