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

Lia*_*Guo 5 python numpy numpy-broadcasting numpy-ndarray

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

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

>>> a = np.zeros((3,4,5,6,7))
>>> a.shape
(3, 4, 5, 6, 7)
Run Code Online (Sandbox Code Playgroud)

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

>>> a[:,:,[0,3],:,:].shape
(3, 4, 2, 6, 7)
Run Code Online (Sandbox Code Playgroud)

但是,如果在以下情况下对数组建立索引,则第三维将排列到最左侧:

>>> a[0,:,[0,1],:,:].shape
(2, 4, 6, 7)
Run Code Online (Sandbox Code Playgroud)

任何人都可以阐明它吗?

Jus*_*rds 1

基本切片:-

当使用切片对象时,就会发生基本切片。通常切片对象被构造为数组[(start:stop:step)]。Ellipsis 和 newaxis 也属于此范围。

示例:- 一维数组

>>x=np.arange(10)    
>>x[2:10:3]
 array([2, 5, 8])
Run Code Online (Sandbox Code Playgroud)

示例:- 2D 数组

>>>x = np.array([[1,2,3], [4,5,6]])
>>>x[1:2]
array([[4, 5, 6]])
Run Code Online (Sandbox Code Playgroud)

示例:- 3D 阵列

>>>x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
>>> x[0:1]
array([[[1],
        [2],
        [3]]])
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,给定的 slice(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])
Run Code Online (Sandbox Code Playgroud)

数组可视化

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

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

现在回答你的问题:-

>>>a=np.array([3,4,5])
>>>a[0,:,[0,1]]
Run Code Online (Sandbox Code Playgroud)

第一个案例:-

其形式为x[arr1,:,arr2]. arr1 和 arr2是高级索引。我们认为 0 也是高级索引。

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

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

>>>a[0,:,[0,1]].shape
(2,4)
Run Code Online (Sandbox Code Playgroud)

第二种情况:-

其形式如下:x[:,:,arr1].这里只有arr1是高级索引。

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

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

>>>a[0:1,:,[0,1]].shape
(1,4,2)
Run Code Online (Sandbox Code Playgroud)

[0,1] 具有形状(2,),并且由于它出现在第三个索引处,因此它被插入到结果数组的第三个索引中。

欢迎任何建议和改进。

参考:-

  1. Numpy_文档