numpy切片,例如S=np.s_[1:-1]; V=A[1:-1]
,生成底层数组的视图。我可以通过V.base
找到这个底层数组。如果我将这样的视图传递给一个函数,例如
def f(x):
return x.base
然后是CCD_ 3。但是怎样才能找到切片信息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>
我更喜欢__array_interface__
值:
In [162]: y.__array_interface__['data']
Out[162]: (163056924, False)
In [163]: y.base.__array_interface__['data']
Out[163]: (163056912, False)
因此y
数据缓冲区在x
之后启动12个字节。由于y.itemsize
是4,这意味着切片开始是3
。
In [164]: y.shape
Out[164]: (7,)
In [165]: x.shape
Out[165]: (10,)
通过对形状的比较,我们推断出切片停止是None
(末端)。
对于2d阵列或阶梯切片,您还必须查看strides
。
但在实践中,将切片对象(元组、切片等)传递给函数可能更容易、更安全,而不是从结果中推导出来。
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
本身,而不是推导它。我以前从未见过这样做。