Numpy 如果我将一个ndarray视图传递给一个函数,我可以找到它的基,但是我如何才能找到切片呢?

Numpy 如果我将一个ndarray视图传递给一个函数,我可以找到它的基,但是我如何才能找到切片呢?,numpy,multidimensional-array,view,slice,base,Numpy,Multidimensional Array,View,Slice,Base,numpy切片,例如S=np.S_U1;[1:-1];V=A[1:-1],生成底层数组的视图。我可以通过V.base找到这个底层数组。如果我将这样的视图传递给函数,例如 def f(x): return x.base 然后f(V)=A。但是如何才能找到切片信息S?我正在寻找一个类似于base的属性,该属性包含创建此视图的切片上的信息。我希望能够编写一个函数,我可以传递一个数组的视图,并返回从该视图计算出的同一数组的另一个视图。例如,我希望能够将视图移动到一维数组的右侧或左侧。据我所知,

numpy切片,例如
S=np.S_U1;[1:-1];V=A[1:-1]
,生成底层数组的视图。我可以通过
V.base
找到这个底层数组。如果我将这样的视图传递给函数,例如

def f(x):
    return x.base

然后
f(V)=A
。但是如何才能找到切片信息
S
?我正在寻找一个类似于
base
的属性,该属性包含创建此视图的切片上的信息。我希望能够编写一个函数,我可以传递一个数组的视图,并返回从该视图计算出的同一数组的另一个视图。例如,我希望能够将视图移动到一维数组的右侧或左侧。

据我所知,切片信息不会存储在任何位置,但您可以从视图和基础的属性中推断出来

例如:

In [156]: x=np.arange(10)
In [157]: y=x[3:]
In [159]: y.base
Out[159]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [160]: y.data
Out[160]: <memory at 0xb1a16b8c>
In [161]: y.base.data
Out[161]: <memory at 0xb1a16bf4>
因此
y
databuffer在
x
之外启动12个字节。由于
y.itemsize
是4,这意味着切片开始是
3

In [164]: y.shape
Out[164]: (7,)
In [165]: x.shape
Out[165]: (10,)
比较这些形状,我推断切片停止是
None
(结束)

对于二维阵列或阶梯式切片,您还必须查看
步长

但实际上,将切片对象(元组、切片等)传递给函数可能更容易、更安全,而不是从结果中推断出来

In [173]: S=np.s_[1:-1]
In [174]: S
Out[174]: slice(1, -1, None)
In [175]: x[S]
Out[175]: array([1, 2, 3, 4, 5, 6, 7, 8])

也就是说,传递
S
本身,而不是推断它。我以前从未见过这样做。

我认为仅仅通过S将无法达到目的,但您提供了我在1d中实现某种直观的5线解决方案所需的功能。我觉得奇怪的是,这种切片的使用在numpy中真的没有预料到。
In [173]: S=np.s_[1:-1]
In [174]: S
Out[174]: slice(1, -1, None)
In [175]: x[S]
Out[175]: array([1, 2, 3, 4, 5, 6, 7, 8])