如何使用内置的“切片”访问二维数组中的二维块?

用户名

我有一个2-d numpy数组,我想为其修改2-d块(例如9x9数独板上的3x3子块)。与其使用花式索引,不如使用内置的slice有没有办法使这项工作?我认为可以使用stride参数(的第三个参数slice)来执行此操作,但是我不太清楚。我的尝试在下面。

import numpy as np

# make sample array (dim-1)
x = np.linspace(1, 81, 81).astype(int)
i = slice(0, 3)

print(x[i])
# [1 2 3]

# make sample array (dim-2)
X = x.reshape((9, 9))

假设我想访问的前3行和前3列X我可以用花式索引来做到这一点:

print(X[:3, :3])
# [[ 1  2  3]
#  [10 11 12]
#  [19 20 21]]

尝试使用与dim-1情况类似的逻辑slice

j = np.array([slice(0,3), slice(0,3)]) # wrong way to acccess 
print(X[j])

引发以下错误:

IndexError: arrays used as indices must be of integer (or boolean) type
威廉·范昂塞姆

如果您下标X[:3, :3],那么在幕后您将经过一个元组,因此(slice(3), slice(3))

因此,您可以使用构建一个j

j = (slice(3), slice(3))

或者您可以通过以下方式获得该a, b区块:

j = (slice(3*a, 3*a+3), slice(3*b, 3*b+3))

所以在这里a=0b=1例如将产生的X[0:3, 3:6]一部分。因此,一个包含前三行和后三列的块。

或者您可以制作一个具有可变数量项的元组。例如,对于一个-n维数组,您可以创建一个n-tuple,每个都有一个slice(3)对象:

j = (slice(3),) * n

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章