【问题标题】:If I pass a ndarray view to a function I can find its base but how can I find the slice?如果我将一个 ndarray 视图传递给一个函数,我可以找到它的基础,但我怎样才能找到切片?
【发布时间】:2016-11-26 21:46:29
【问题描述】:

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

def f(x):
    return x.base

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

【问题讨论】:

    标签: numpy multidimensional-array view slice base


    【解决方案1】:

    据我所知,切片信息并未存储在任何地方,但您也许可以从视图和基础的属性中推断出来。

    例如:

    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(结束)。

    对于二维数组或阶梯式切片,您还必须查看 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 本身,而不是推断它。我以前从未见过它。

    【讨论】:

    • 我认为仅仅通过 S 会破坏目的,但您提供了我需要的 1d 中有点直观的 5 行解决方案。如果在 numpy 中真的没有预料到这种切片的使用,这对我来说似乎很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2016-09-11
    • 2021-12-04
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多