访问ndarray并丢弃无效位置 - Python

时间:2014-04-16 22:45:49

标签: python numpy matrix multidimensional-array

我有一个关于访问实际上不存在的矩阵位置的问题。

首先,我有一个包含行和 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应该有一个聪明的方法来正确地做到这一点。

提前谢谢。

1 个答案:

答案 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赢了'重要)。