python省略号用法_关于numpy:你如何在Python中使用省略号切片语法?

这出现在Python的隐藏功能中,但我看不到可以解释该功能如何工作的好文档或示例。

省略号用于切割高维数据结构。

它被设计为在这一点上,插入尽可能多的完整切片(:)以将多维切片扩展到所有维度。

例:

>>> from numpy import arange

>>> a = arange(16).reshape(2,2,2,2)

现在,您有一个2x2x2x2的4维矩阵。要选择第4维中的所有第一个元素,可以使用省略号表示法

>>> a[..., 0].flatten()

array([ 0,  2,  4,  6,  8, 10, 12, 14])

这相当于

>>> a[:,:,:,0].flatten()

array([ 0,  2,  4,  6,  8, 10, 12, 14])

在您自己的实现中,您可以自由地忽略上面提到的合同,并将其用于您认为合适的任何内容。

也许我错了,但不是a[:,:,:,0]会返回副本而a[...,0]会返回"视图"而不是副本吗?我尝试对两个版本和3-dim数组运行id():a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2]都有不同的ID,而:a[..., 0], a[..., 1], a[..., 2]都有相同的ID。

@ mohitsharma44不在我的机器上;)id()为两者返回相同的值。同样用__array_interface__[data]检查显示相同的内存地址。

我发现我们可以使用a[indexes, ...]而a是一个1维数组!

什么是4维矩阵?将它称为4维数组而不是矩阵是有意义的。,IMO。

椭圆也可用于零维数据结构。它们是我知道写入标量numpy.ndarrays的唯一方法,例如:my_scalar = np.asarray(3); my_scalar [...] = 5.如果你执行my_scalar [:] = 5,你将理所当然地得到一个错误,因为没有维度为0:迭代。

@SuperElectric您也可以使用my_scalar.itemset(标量值)。当然,my_scalar [...] = scalar_value更短,但你在上面的评论中说过,这是你知道的唯一方法。只是提供替代方案。

你可以在自己的类中使用它,因为没有内置类可以使用它。

Numpy使用它,如文档中所述。这里有一些例子。

在你自己的课堂上,你会像这样使用它:

>>> class TestEllipsis(object):

...     def __getitem__(self, item):

...         if item is Ellipsis:

...             return"Returning all items"

...         else:

...             return"return %r items" % item

...

>>> x = TestEllipsis()

>>> print x[2]

return 2 items

>>> print x[...]

Returning all items

当然,还有python文档和语言参考。但那些并不是很有帮助。

看起来相当破碎,因为"propper"说出所有项目的方式是>>> x [:] >>> x [:,1:2]

@Ronny:重点是展示省略号的一些自定义用法。

链接似乎被打破了。

这是省略号的另一个用途,它与切片无关:我经常在与队列的线程内通信中使用它,作为发出"完成"信号的标记;它就在那里,它是一个对象,它是一个单例,它的名字意味着"缺乏",并且它不是过度使用的无(可以作为正常数据流的一部分放入队列中)。因人而异。

可能会更清楚地说:"Done = object()"在某处并使用它?

不一定 - 它要求你实际上在某处说Done = object()。 Sentinel值不一定是坏事 - 并且使用其他几乎没用的Python单例作为哨兵并不是那么可怕的IMO(Ellipsis和()是我用过的地方,没有人会混淆)。

关于Done = object(),我认为使用省略号更好,特别是如果你用它来与队列进行通信。如果从内部线程到内部进程通信,id(Done)在另一个进程中将不相同,并且没有任何东西可以将一个对象与另一个对象区分开来。省略号的ID也不一样,但至少类型是相同的 - 这是单身人士的要点。

问题是"你如何使用省略号",但我相信你采取了错误的方式。它有很多解释。但我认为正确的是:"如何使用省略号?"即"我应该采取哪些步骤在我自己的代码中使用省略号"。

如其他答案中所述,它可用于创建切片。

当您不想编写许多完整切片符号(:)时,或者您不确定要操作的数组的维数时,这非常有用。

我认为重要的是突出显示,而其他答案中缺少的是,即使没有更多的维度需要填写,它也可以使用。

例:

>>> from numpy import arange

>>> a = arange(4).reshape(2,2)

这将导致错误:

>>> a[:,0,:]

Traceback (most recent call last):

File"", line 1, in

IndexError: too many indices for array

这将有效:

a[...,0,:]

array([0, 1])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值