【问题标题】:Python array indexed with list but array dimensions are permutedPython数组用列表索引,但数组维度被置换
【发布时间】:2019-07-25 23:13:55
【问题描述】:

我尝试使用列表来索引一个数组(有五个维度)。但是,在某些情况下,数组会被置换。

假设a的形状为(3,4,5,6,7),即,

>>> a = np.zeros((3,4,5,6,7))
>>> a.shape
(3, 4, 5, 6, 7)

使用列表在第三维索引这个数组,看起来很正常:

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

但是,如果数组在以下情况下被索引,则第三个维度被置换到最左边:

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

谁能解释一下?

【问题讨论】:

    标签: python numpy numpy-ndarray array-broadcasting


    【解决方案1】:

    基本切片:-

    基本切片在使用slice对象时发生。通常切片对象构造为array[(start:stop:step)]。省略号和newaxis也属于此。 p>

    示例:- 一维数组

    >>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]])
    

    示例:- 3D 数组

    >>>x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
    >>> x[0:1]
    array([[[1],
            [2],
            [3]]])
    

    在上面的例子中,给定的 slices(obj) 的数量小于数组的总维数。 如果选择元组中的对象数量小于 N,则假定为任何后续维度。

    高级切片:-

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

    1. 是一个非元组序列对象,
    2. 一个 ndarray(数据类型为整数或布尔值),
    3. 具有至少一个序列对象或 ndarray(数据类型为整数或布尔值)的元组。

    有两种类型的高级索引:整数和布尔。

    整数索引:-

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

    当索引由与被索引数组的维度一样多的整数数组组成时,索引是直截了当的,但不同于切片

    例子:-

    >>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] 具有 shape(2,) 并且由于它出现在第三个索引处,因此它被插入到结果数组的第三个索引中。

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

    参考:-

    1. Numpy_Docs

    【讨论】:

      【解决方案2】:

      感谢@Hari_Sheldon 的回复。现在,我已经看到 print 对数组 a 做了什么,但我仍然不明白为什么 Python 会使用由 a 指定的那些列列表并将它们作为行放在最左边的位置。有什么参考资料可以解释原因吗?

      而且,在某些情况下,这种维度排列不会发生,即:

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

      如您所见,不是将其置换为 (2, 4),而是保留了维度顺序!

      【讨论】:

      • 你已经回答了你必须评论的地方。如果您尝试a[0] and a[0:1]之间的区别,您可以理解一个返回形状()和另一个返回形状(1,)1D b> 列表
      • 是的,我理解保留退化维度的规则。但是,我不明白为什么保留退化维度会阻止数组排列。换句话说,为什么 a[0:1,0,[0,3]] 不返回 (2,1,4) 的形状?
      猜你喜欢
      • 2019-12-19
      • 2020-06-11
      • 1970-01-01
      • 2019-05-22
      • 2022-01-15
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 2019-11-20
      相关资源
      最近更新 更多