如何在没有评估的情况下动态切片数组?
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
我现在需要对可变形状/维度的数组进行动态切片。所以我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