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))
Ellipsis
和 slice
是内置的,我们可以阅读它们的文档:
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 ndarray