如果我将ndarray视图传递给函数,我可以找到它的基,但如何找到切片



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本身,而不是推导它。我以前从未见过这样做。

相关内容

  • 没有找到相关文章

最新更新