Python数组使用列表索引,但数组维度被排列

Python数组使用列表索引,但数组维度被排列,python,numpy,numpy-ndarray,array-broadcasting,Python,Numpy,Numpy Ndarray,Array Broadcasting,我尝试使用列表对数组(有五个维度)进行索引。但是,在某些情况下,数组是置换的 例如,a的形状为(3,4,5,6,7),即 使用列表在第三维上对此数组进行索引,看起来很正常: >>> a[:,:,[0,3],:,:].shape (3, 4, 2, 6, 7) 但是,如果在以下情况下对数组进行索引,则第三维将排列到最左侧: >>> a[0,:,[0,1],:,:].shape (2, 4, 6, 7) 有人能解释一下吗?基本切片:- 使用对象时会进行基本切片

我尝试使用列表对数组(有五个维度)进行索引。但是,在某些情况下,数组是置换的

例如,a的形状为(3,4,5,6,7),即

使用列表在第三维上对此数组进行索引,看起来很正常:

>>> a[:,:,[0,3],:,:].shape
(3, 4, 2, 6, 7)
但是,如果在以下情况下对数组进行索引,则第三维将排列到最左侧:

>>> a[0,:,[0,1],:,:].shape
(2, 4, 6, 7)

有人能解释一下吗?

基本切片:-

使用对象时会进行基本切片。通常切片对象被构造为数组[(开始:停止:步骤)]。省略号和newaxis也属于此范围

示例:-1D数组

>>x=np.arange(10)    
>>x[2:10:3]
 array([2, 5, 8])
>>>x = np.array([[1,2,3], [4,5,6]])
>>>x[1:2]
array([[4, 5, 6]])
>>>x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
>>> x[0:1]
array([[[1],
        [2],
        [3]]])
示例:-2D阵列

>>x=np.arange(10)    
>>x[2:10:3]
 array([2, 5, 8])
>>>x = np.array([[1,2,3], [4,5,6]])
>>>x[1:2]
array([[4, 5, 6]])
>>>x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
>>> x[0:1]
array([[[1],
        [2],
        [3]]])
示例:-3D阵列

>>x=np.arange(10)    
>>x[2:10:3]
 array([2, 5, 8])
>>>x = np.array([[1,2,3], [4,5,6]])
>>>x[1:2]
array([[4, 5, 6]])
>>>x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
>>> x[0:1]
array([[[1],
        [2],
        [3]]])
在上面的示例中,给定的切片数(obj)小于数组维数的总数如果选择元组中的对象数小于N,则在任何后续维度中都假定为N。

高级切片:-

当选择对象为obj
时,会触发高级索引

  • 是一个非元组序列对象
  • 数据类型为整数或布尔的数据数组
  • 至少有一个序列对象或ndarray(数据类型为integer或bool)的元组
  • 有两种类型的高级索引:整数和布尔值。

    整数索引:-

    整数数组索引允许根据数组中的任意项的N维索引选择它们。每个整数数组表示该维度中的多个索引

    >>>a[0,:,[0,1]].shape
    (2,4)
    
    当索引包含的整数数组与被索引数组的维数相同时,索引是直接的,但与切片不同

    例如:-

    >>a = np.array([[1,2,3],[4,5,6],[7,8,9]])
    >>a[[0,1,2],[0,1,1]]
    array([1, 5, 8])
    

    上面的示例打印: a[0,0]、a[1,0]、a[2,1]

    记住:-所以整数索引在两个索引之间映射

    现在谈谈你的问题:-

    >>>a=np.array([3,4,5])
    >>>a[0,:,[0,1]]
    
    第一种情况:-

    其形式为
    x[arr1,:,arr2]。
    <强> ARR1和ARR2<强>是高级索引。我们认为0也是一个高级索引。

    如果高级索引由切片、省略号或newaxis分隔,则高级索引操作产生的维度首先出现在结果数组中,然后是子空间维度。

    这本质上意味着[0,1]的维度在数组中排在第一位。我将退出0,因为它没有维度

    >>>a[0,:,[0,1]].shape
    (2,4)
    
    第二种情况:-

    它的形式是
    x[:,:,arr1]。
    这里只有arr1是高级索引

    如果高级索引彼此相邻,则高级索引操作中的维度将插入到结果数组中与初始数组中相同的位置。

    这本质上意味着[0,1]的维度位于数组索引中指定的相应位置

    >>>a[0:1,:,[0,1]].shape
    (1,4,2)
    
    [0,1]的形状为(2,),由于它出现在第三个索引处,所以被插入结果数组的第三个索引中

    欢迎提出任何建议和改进。

    参考:-


  • 谢谢@Hari_Sheldon的回复。现在,我已经看到了print对数组a所做的操作,但是我仍然不明白为什么Python会将列表指定的列作为行放在最左边的位置。有没有参考资料来解释原因

    并且,在某些情况下,该维度置换不会发生,即:

    >>> a[0:1,:,[0,3]].shape
    (1, 4, 2)
    

    如您所见,没有将其排列为(2,4),而是保留了维度顺序

    你已经回答了你必须评论的问题。如果您尝试一下
    a[0]和[0:1]之间的区别,您就会明白。对于1D列表,一个返回一个形状(),另一个返回一个形状(1),是的,我理解保留退化维度的规则。然而,我不明白为什么保留退化维度会阻止数组排列。换句话说,[0:1,0,[0,3]]为什么不返回(2,1,4)的形状?