“numpy”中的“切片”(:) 和“省略号”(...) 运算符有什么区别?

Mic*_*ael 1 numpy python-3.x numpy-ndarray

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

我对这个主题的研究:

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

  2. 我已经讨论过这个问题,它涉及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])
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  • slice使用vsellipsis运算符与有何区别numpy.ndarrays
  • 它们可以互换使用吗?
  • 使用其中之一有什么优点吗?

我非常感谢您对我的问题进行详细说明,并提前感谢您的宝贵时间。

Mar*_*ell 5

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

  • 省略号的意思是“所有其他维度(我懒得去列举或者不确定或者不关心有多少)”

  • 切片的意思是“由起始和结束索引(和步幅)指定的当前维度的子集”

  • 并不真地。`[..., 1]` 可能意味着 `[:,1]` 或 `[:,:,:,:,1]` (2认同)
  • 这就像说“2+2”给出与“2x2”相同的结果,因此加号和乘法运算符必须相同。有时他们可以给出相同的结果,但通常不会。如果你执行 `A = np.zeros((8,6,4))` 然后打印 `A[:,1].shape` 你会看到它是 `(8, 4)` 但如果你打印 `A [...,1].shape` 你会看到它是 `(8,6)`。 (2认同)