【问题标题】:What is the difference between the `slice` (:) and the `ellipsis` (...) operators in `numpy`?`numpy` 中的 `slice` (:) 和 `ellipsis` (...) 运算符有什么区别?
【发布时间】:2020-11-28 12:25:08
【问题描述】:

我遇到了一个代码,其中作者使用ellipsis 运算符(例如,[..., 1])和numpy 数组而不是slice 运算符(例如,[:, 1])获取数组部分。

我对该主题的研究:

  1. scipy github wiki page 我了解到,这两个运算符执行的操作有些相似,即返回多维数组的一个切片。

  2. 我翻过this question,其中处理了numpy数组的几种切片技术,但没有找到关于何时应该使用slice运算符以及何时需要使用ellipsis,或者它们的功能是否相同。

  3. 来自Example 1 我看不出这两个运算符有什么区别:

示例 1:

    import numpy as np

    A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    A[..., 0], A[:, 0]    # Out: (array([1, 4, 7]), array([1, 4, 7]))
    A[..., 0] == A[:, 0]  # Out: array([ True,  True,  True])

所以我的问题是:

  • sliceellipsis 运算符与 numpy.ndarrays 一起使用有什么区别?
  • 它们可以互换使用吗?
  • 使用其中一种有什么优势吗?

非常感谢您能详细说明我的问题,并提前感谢您抽出宝贵时间。

【问题讨论】:

    标签: python-3.x numpy numpy-ndarray


    【解决方案1】:

    两者背后的动机完全不同。

    • 省略号表示“所有其他维度(我懒得一一列举或不确定或不在乎有多少)”

    • 切片表示“由开始和结束索引(和步幅)指定的当前维度的子集”

    【讨论】:

    • 我明白了,但是在 Example 1 的情况下它们可以互换使用吗?
    • 并非如此。 [..., 1] 可能意味着 [:,1][:,:,:,:,1]
    • 那么为什么输出是相同的呢?我的意思是 - 是否存在输出不同的情况?
    • 这就像是说2+2 给出了与2x2 相同的结果,因此加号和时间运算符必须相同。有时他们可以给出相同的结果,但通常他们不会。如果您执行A = np.zeros((8,6,4)),然后打印A[:,1].shape,您会看到它是(8, 4),但如果您打印A[...,1].shape,您会看到它是(8,6)
    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 2023-03-15
    • 1970-01-01
    • 2018-08-16
    • 2012-10-10
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多