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

时间:2020-02-20 11:46:34

标签: python-3.x numpy multidimensional-array indexing slice

我有一个2-d numpy数组,我想为其修改2-d块(例如9x9数独板上的3x3子块)。我想使用内置的slice而不是花哨的索引。有没有办法使这项工作?我认为可以使用跨步参数(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))

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

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

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

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

1 个答案:

答案 0 :(得分:0)

如果您用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元组,每个元组都有一个slice(3)对象:

j = (slice(3),) * n