我尝试使用列表为数组(具有五个维度)建立索引。但是,在某些情况下,数组会发生排列。
说,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)
有人可以阐明吗?
答案 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 ,
触发高级索引高级索引有两种类型:整数和布尔值。
整数索引:-
整数数组索引允许根据数组的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也是高级索引。
如果高级索引被切片,椭圆或换轴分隔,则高级索引操作产生的维将首先出现在结果数组中,子空间维将在结果数组中。
这实际上意味着[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 :(得分:0)
感谢@Hari_Sheldon的回复。现在,我已经了解了 print 对数组 a 所做的操作,但是我仍然不明白为什么Python会接受a所指定的那些列列出并将其作为行放在最左边的位置。有没有参考资料来解释原因?
而且,在某些情况下,不会发生此尺寸排列,即:
>>> a[0:1,:,[0,3]].shape
(1, 4, 2)
如您所见,尺寸顺序保持不变,而不是将其置换为(2,4)!