如何在没有评估的情况下动态切片数组?

How to dynamically slice array without eval?

我现在需要对可变形状/维度的数组进行动态切片。所以我assemble一个字符串来访问它。

这在访问数据时工作正常。

some_data = eval("arr[:,[ci]]")

#or

some_data = eval("arr[:,[ci],:]")

#or

some_data = eval("arr[:,:,:,[ci]]")

#etc.

但是 eval() 的限制阻止我使用这种方法分配

eval("arr[:,[ci]]") = some_data

有什么方法可以不用 eval() 切片吗?

在Python中,类型的索引操作由__getitem__/__setitem__/__delitem__ magic methods实现。要了解如何解释索引语法,以及如何调用这些方法,我们可以简单地定义我们自己的 class:

class test:
    def __getitem__(self, idx):
        return idx

test()[:, [1,2,3], ...]
# result: (slice(None, None, None), [1, 2, 3], Ellipsis)

slice 类型是同一文档前面提到的内置类型,具有 link 到 more specific information

Ellipsis 只是由文字语法 ... 创建的对象的名称。 Numpy 使用它来表示任意数量的轴的完整范围 - 因此这让我们避免担心我们正在使用的数组的维数。

要认识到的重要一点是,我们可以直接使用相同的索引元组,以获得相同的结果。

因此,给定一个用 [ci] 切片的维度,我们可以构造必要的元组,并用它索引:

all = slice(None)
def make_index(ci, dimension):
    return (all,) * dimension + ([ci], Ellipsis)

# Now we can do things like:
arr[make_index(ci, dimension)] = some_data