切片slice(start, stop[, step])
的切片索引通常可以由range(start, stop, step)
(或当考虑基础维度时为range(*slice(start, stop, step).indices(length))
)表示。表示连接切片的切片
比方说,我甚至有两个多维切片,第二个切片可以用作应用第一个切片结果的切片。
例子:
import numpy as np
data = np.random.rand(*(100, 100, 100))
a = data[::2, 7, :] # slice 1, a.shape = (50,100)
b = a[1, ::-1] # slice 2, b.shape = (100,)
我想找个一般表达式计算单个片,做同样的工作。我知道底层数据结构的维度。
c = data[2, 7, ::-1] # same as b
np.array_equal(b, c) # True
所以,在这个例子中,从[::2, 7, :]
和[1, ::-1]
前往[2, 7, ::-1]
我需要像一个函数:
def concatenate_slices(shape, outer_slice, inner_slice):
...
return combined_slice
其中outer_slice
和inner_slice
都希望能切片的元组。在示例shape=(100, 100, 100)
和outer_slice=(slice(None, None, 2), 7, slice(None, None, None))
和inner_slice=(1, slice(None, None, -1))
中。
我不知道如何有效地做到这一点。
当我调用__getitem__(slice)
(没有中间视图)时,我的对象会做某些事情,我只想做一次,但仍然有可能切片。
作为一个扩展(可选),我想知道如果我在切片中有椭圆会发生什么。那我该如何组合?
仅供参考:'range(start,stop,step)'并不总是产生正确的索引,因为它也可能产生索引超出范围,以创建一个有效范围['slice.indices()']( https://docs.python.org/3/reference/datamodel.html?highlight=slice.indices#slice.indices)需要被使用:'range(* slice(start,stop,step).indices(length) )'。我不确定是否可以将切片组合而不考虑底层结构的形状。 – mata
@mata谢谢。你是对的。在我的情况下,我也会知道底层结构的形状。我编辑了一下。 – Trilarion
我想这可以通过查看前两个的限制来手动组合新切片来完成。我开始写它,但对我来说太麻烦了,应该有更好的方法(所以我放弃了)。 –