Python 为什么numpy混合基本/高级索引依赖于切片邻接?
我知道以前也有人问过类似的问题(),但恐怕没有人回答我的具体问题 我的问题是关于numpy混合高级/基本索引的描述: 。。。需要区分指数组合的两种情况:Python 为什么numpy混合基本/高级索引依赖于切片邻接?,python,numpy,multidimensional-array,numpy-ndarray,Python,Numpy,Multidimensional Array,Numpy Ndarray,我知道以前也有人问过类似的问题(),但恐怕没有人回答我的具体问题 我的问题是关于numpy混合高级/基本索引的描述: 。。。需要区分指数组合的两种情况: 高级索引由切片、省略号或newaxis分隔。例如x[arr1,:,arr2] 高级索引彼此相邻。例如x[…,arr1,arr2,:]但不是x[arr1,:,1],因为1是这方面的高级索引 在第一种情况下,高级索引操作产生的维度在结果数组中排在第一位,然后是子空间维度。在第二种情况下,来自高级索引操作的维度被插入到结果数组中,位置与它们在初始
- 高级索引由切片、省略号或newaxis分隔。例如
x[arr1,:,arr2]
- 高级索引彼此相邻。例如
但不是x[…,arr1,arr2,:]
,因为x[arr1,:,1]
是这方面的高级索引1
x[arr1,:,arr2]。重塑((len(arr1),x.shape[1]))
我知道您可以使用实现案例2中描述的行为,但在我看来,默认索引行为中的这种不一致性是意外的,也是不合理的。有人能证明这一点吗
谢谢,案例2的行为对于案例1没有很好的定义。在下面的句子中,你可能遗漏了一个微妙之处:
在第二种情况下,来自高级索引操作的维度被插入到结果数组中,位置与它们在初始数组中的位置相同
您可能正在想象输入和输出维度之间的一对一对应关系,可能是因为您正在想象Matlab风格的索引。NumPy不是那样工作的。如果有四个具有以下形状的阵列:
a.shape == (2, 3, 4, 5, 6)
b.shape == (20, 30)
c.shape == (20, 30)
d.shape == (20, 30)
然后a[b,:,c,:,d]
有四个维度,长度分别为3,5,20和30。没有明确的地方可以放置20和30。NumPy默认将它们粘贴在前面
另一方面,使用
a[:,b,c,d,:]
,20和30可以到达3,4和5所在的位置,因为3,4和5彼此相邻。整个新维度块与原始维度块的位置相同,只有原始维度在原始形状的单个块中时才起作用。谢谢-这非常有用,是的,我想象的是输入/输出维度的一对一映射。事实上,我把np.ix
的广播行为与高级索引的迭代行为混淆了。