【问题标题】:Why aren't some dimensions shown in the output even when according to the indexing they should be?为什么即使根据索引它们应该在输出中显示某些维度?
【发布时间】:2019-12-23 14:22:57
【问题描述】:
b = np.array([[[0, 2, 3], [10, 12, 13]], [[20, 22, 23], [110, 112, 113]]]) 

print(b[..., -1]) 
>>>[[3, 13], [23, 113]]

为什么这个输出显示第一个轴而不显示第二个轴(要显示第二个轴,它必须在自己的列表中显示每个数字)?当每个第二个维度列表只显示一个数字时,Numpy 是否试图最小化不必要的维度显示?为什么 numpy 不精确复制原始数组的维度?

【问题讨论】:

  • 使用缩放器索引会删除该维度。文档应该清楚这一点。

标签: numpy multidimensional-array indexing


【解决方案1】:
In [7]: b = np.array([[[0, 2, 3], [10, 12, 13]], [[20, 22, 23], [110, 112, 113]]])  

In [8]: b                   # (2,2,3) shape array                                                                                                    
Out[8]: 
array([[[  0,   2,   3],
        [ 10,  12,  13]],

       [[ 20,  22,  23],
        [110, 112, 113]]])
In [9]: b[..., -1]                                                                                           
Out[9]: 
array([[  3,  13],
       [ 23, 113]])

b 的这个切片是一个 (2,2) 数组。这不仅仅是展示的问题。存在轴 0 和 1;删除的是轴 2。

使用列表或切片进行索引:

In [10]: b[..., [-1]]      # (2,2,1)                                                                                        
Out[10]: 
array([[[  3],
        [ 13]],

       [[ 23],
        [113]]])
In [11]: b[..., -1:]                                                                                         
Out[11]: 
array([[[  3],
        [ 13]],

       [[ 23],
        [113]]])

https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

这个索引页面很长,但它涵盖了这些情况(以及更多)。

【讨论】:

    【解决方案2】:

    为什么这个输出显示第一个轴而不显示第二个轴(要显示第二个轴,它必须在自己的列表中显示每个数字)?

    它确实显示了第一个和第二个轴。请注意,您在这里有一个二维数组,并且保留了第一个和第二个轴。只有第三个轴“塌陷”了。

    对于 3d 数组,您的索引相当于:

    b[:, :, -1]
    

    这意味着你创建了一个二维数组c,其中cij = bij-1-1 表示最后一个元素,所以 cij=bij2

    b 具有值:

    >>> b
    array([[[  0,   2,   3],
            [ 10,  12,  13]],
    
           [[ 20,  22,  23],
            [110, 112, 113]]])

    这意味着我们的结果 c 具有 c00=b0023 ;对于 c01=b012 这是13;对于 c10=b102 这是23;对于c11=b112,即113

    所以最终产品是:

    >>> b[:,:,-1]
    array([[  3,  13],
           [ 23, 113]])
    >>> b[...,-1]
    array([[  3,  13],
           [ 23, 113]])
    

    通过为给定维度指定一个值,该维度“折叠”。另一种合理的选择是使用大小为1 的维度,但通常执行此类下标以检索具有较少维度的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多