我有一个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
答案 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=0
和b=1
例如将产生X[0:3, 3:6]
部分。因此,一个包含前三行和后三列的块。
或者您可以使元组具有可变数量的项。例如,对于一个n
维数组,您可以创建一个n
元组,每个元组都有一个slice(3)
对象:
j = (slice(3),) * n