【问题标题】:How to understand numpy's combined slicing and indexing example如何理解 numpy 的组合切片和索引示例
【发布时间】:2016-10-05 05:29:20
【问题描述】:

我正在尝试了解 numpy 的组合切片和索引概念,但是我不确定如何从 numpy 的输出中正确获取以下结果(手动以便我们了解 numpy 进程如何组合切片和索引,哪个是先处理?):

>>> import numpy as np
>>> a=np.arange(12).reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> i=np.array([[0,1],[2,2]])
>>> a[i,:]
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [ 8,  9, 10, 11]]])
>>> j=np.array([[2,1],[3,3]])
>>> a[:,j]
array([[[ 2,  1],
        [ 3,  3]],

       [[ 6,  5],
        [ 7,  7]],

       [[10,  9],
        [11, 11]]])
>>> aj=a[:,j]
>>> aj.shape
(3L, 2L, 2L)

上面的输出让我对aj的形状如何变成(3,2,2)有点困惑,非常感谢任何详细的解释,谢谢!

【问题讨论】:

    标签: python arrays numpy indexing


    【解决方案1】:

    每当您使用索引数组时,结果都具有与索引相同的形状;例如:

    >>> x = np.ones(5)
    >>> i = np.array([[0, 1], [1, 0]])
    >>> x[i]
    array([[ 1.,  1.],
           [ 1.,  1.]])
    

    我们使用 2x2 数组进行索引,结果是 2x2 数组。 当与切片组合时,切片的大小将被保留。例如:

    >>> x = np.ones((5, 3))
    >>> x[i, :].shape
    (2, 2, 3)
    

    第一个示例是 2x2 项目数组,此示例是(长度为 3)行的 2x2 数组。

    切换切片顺序时也是如此:

    >>> x = np.ones((5, 3))
    >>> x[:, i].shape
    (5, 2, 2)
    

    这可以被认为是五个 2x2 数组的列表。

    请记住:当使用列表或数组索引任何维度时,结果具有索引的形状,而不是输入的形状。

    【讨论】:

    • 感谢您的回答,您能否推荐任何关于numpy索引和切片的好的参考来源? numpy 的参考手册好像不够详细。
    • 我在我的书中详细讨论了它,这本书将很快作为 Jupyter 笔记本的集合免费提供:github.com/jakevdp/PythonDataScienceHandbook
    【解决方案2】:

    a[:,j][0] 等价于 a[0,j][0, 1, 2, 3][j] 给你[[2, 1], [3, 3]])

    a[:,j][1] 等价于 a[1,j][4, 5, 6, 7][j] 给你[[6, 5], [7, 7]])

    a[:,j][2] 等价于 a[2,j][8, 9, 10, 11][j] 给你[[10, 9], [11, 11]])

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-27
      • 2015-01-21
      • 2014-05-07
      • 2022-07-21
      • 1970-01-01
      • 2015-02-02
      • 2017-06-24
      • 1970-01-01
      相关资源
      最近更新 更多