使用列表索引的Python数组,但排列尺寸已置换

时间:2019-03-04 15:45:26

标签: python numpy numpy-ndarray numpy-broadcasting

我尝试使用列表为数组(具有五个维度)建立索引。但是,在某些情况下,数组会发生排列。

说,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)

有人可以阐明吗?

2 个答案:

答案 0 :(得分:1)

基本切片:-

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

示例:-一维数组

>>x=np.arange(10)    
>>x[2:10:3]
 array([2, 5, 8])

示例:-2D阵列

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

Array Visualization

上面的示例打印:        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也是高级索引。

如果高级索引被切片,椭圆或换轴分隔,则高级索引操作产生的维将首先出现在结果数组中,子空间维将在结果数组中。

这实际上意味着[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

答案 1 :(得分:0)

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

而且,在某些情况下,不会发生此尺寸排列,即:

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

如您所见,尺寸顺序保持不变,而不是将其置换为(2,4)!