【问题标题】:Accessing ndarray and discarding invalid positions - Python访问 ndarray 并丢弃无效位置 - Python
【发布时间】:2014-04-16 22:45:49
【问题描述】:

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

首先,我有一个包含 rows 行和 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),返回第一行/列 = 0 的 3 x 3

我知道我可以通过一些 if 语句来实现这一点。但我想 Python 应该有一个聪明的方法来正确地做到这一点。

提前谢谢你。

【问题讨论】:

标签: python numpy matrix multidimensional-array


【解决方案1】:

我会创建一个新矩阵,并在其周围填充(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 是偶数,则子矩阵的中心 定义不明确。

如果您真的想让子矩阵与只有一行的数据矩阵重叠,那么您需要用 n-1 零填充(在这种情况下,偶数与奇数 n 无关紧要)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2017-05-12
    • 2011-09-27
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多