Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么numpy混合基本/高级索引依赖于切片邻接?_Python_Numpy_Multidimensional Array_Numpy Ndarray - Fatal编程技术网

Python 为什么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是这方面的高级索引 在第一种情况下,高级索引操作产生的维度在结果数组中排在第一位,然后是子空间维度。在第二种情况下,来自高级索引操作的维度被插入到结果数组中,位置与它们在初始

我知道以前也有人问过类似的问题(),但恐怕没有人回答我的具体问题

我的问题是关于numpy混合高级/基本索引的描述:

。。。需要区分指数组合的两种情况:

  • 高级索引由切片、省略号或newaxis分隔。例如
    x[arr1,:,arr2]
  • 高级索引彼此相邻。例如
    x[…,arr1,arr2,:]
    但不是
    x[arr1,:,1]
    ,因为
    1
    是这方面的高级索引
在第一种情况下,高级索引操作产生的维度在结果数组中排在第一位,然后是子空间维度。在第二种情况下,来自高级索引操作的维度被插入到结果数组中,位置与它们在初始数组中的位置相同(后一种逻辑使简单高级索引的行为类似于切片)

为什么有必要进行这种区分? 我希望案例2所描述的行为能够在所有案例中使用。为什么索引彼此相邻很重要

我理解,在某些情况下,您可能需要案例1的行为;例如,沿新维度对索引结果进行“矢量化”。但这种行为可以而且应该由用户定义。也就是说,如果案例2的行为是默认行为,那么案例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
的广播行为与高级索引的迭代行为混淆了。