【问题标题】:How to use built-in `slice` to access 2-d blocks in 2-d array?如何使用内置的`slice`访问二维数组中的二维块?
【发布时间】:2020-06-04 17:42:07
【问题描述】:

我有一个二维 numpy 数组,我想修改二维块(如 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))

假设我想访问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

【问题讨论】:

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


    【解决方案1】:

    如果你用X[:3, :3]下标,那么你在窗帘后面传递一个元组,所以(slice(3), slice(3))

    所以你可以构造一个j

    j = <b>(</b>slice(3)<b>,</b> slice(3)<b>)</b>

    或者您可以通过以下方式获取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),)<b> * n</b>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2020-11-11
      • 2012-06-01
      相关资源
      最近更新 更多