Numpy: arr[...,0,:] 有效。但是如何存储 slice 命令中包含的数据(...、0、:)?

Posted

技术标签:

【中文标题】Numpy: arr[...,0,:] 有效。但是如何存储 slice 命令中包含的数据(...、0、:)?【英文标题】:Numpy: arr[...,0,:] works. But how do I store the data contained in the slice command (..., 0, :)? 【发布时间】:2011-10-11 08:37:39 【问题描述】:

在 Numpy(和一般的 Python,我想)中,如何存储切片索引,例如 (...,0,:),以便将其传递并应用于各种数组?比如说,能够在函数之间传递切片索引会很好。

【问题讨论】:

【参考方案1】:

等价于(...,0,:) 应该是...

>>> myslice = (..., 0, slice(None, None))
>>> myslice
(Ellipsis, 0, slice(None, None, None))

【讨论】:

不,不是slice(0)0 只是一个索引。【参考方案2】:

我认为您只想执行 myslice = slice(1,2) 来定义一个将返回第二个元素的切片(即 myarray[myslice] == myarray[1:2])

【讨论】:

【参考方案3】:

Python 使用切片语法创建特殊对象,但仅在方括号内用于索引。您可以手动创建这些对象(在这种情况下,(...,0,:)(Ellipsis, 0, slice(None, None, None)),或者您可以创建一个小辅助对象:

class ExtendedSliceMaker(object):
    def __getitem__(self, idx):
        return idx

>>> ExtendedSliceMaker()[...,0,:]
(Ellipsis, 0, slice(None, None, None))

【讨论】:

这直接解决了问题,假设您实际上并不关心表示或它的含义,因为您只是将它传递给 Numpy 使用。我基本上有同样的想法,但展示了如何深入研究并弄清楚一切是什么:)【参考方案4】:

关于 Python 的巧妙之处在于,您实际上可以创建一个类来检查这些事物是如何表示的。 Python 使用魔术方法__getitem__ 来处理索引操作,因此我们将创建一个重载它的类以向我们显示传入的内容、实例化该类并“索引”到实例:

class foo:
  def __getitem__(self, index): print index

foo()[...,0,:]

我们的结果是:

(Ellipsis, 0, slice(None, None, None))

Ellipsisslice 是内置的,我们可以阅读它们的文档:

help(Ellipsis)
help(slice)

【讨论】:

【参考方案5】:

在 NumPy 中使用 s_:

In [1]: np.s_[...,0,:]
Out[1]: (Ellipsis, 0, slice(None, None, None))

【讨论】:

以上是关于Numpy: arr[...,0,:] 有效。但是如何存储 slice 命令中包含的数据(...、0、:)?的主要内容,如果未能解决你的问题,请参考以下文章

有效地计算numpy数组中的零元素?

分组和平均 NumPy 矩阵

如何在给定索引列表的情况下有效地更新 numpy ndarray

numpy 分区如何工作

len(arr)和arr.shape [0]之间的Numpy性能差距

numpy.array()是否等于numpy.stack(...,axis = 0)?