Python Numpy非零/平坦非零索引顺序;布尔索引中返回元素的顺序

Python Numpy非零/平坦非零索引顺序;布尔索引中返回元素的顺序,python,numpy,Python,Numpy,我想知道numpy.nonzero/numpy.flatnonzero返回的索引的顺序 我在文件里找不到关于它的任何东西。它只是说: A[nonzero(flag)] == A[flag] 虽然在大多数情况下,这已经足够了,但当您需要索引的排序列表时,也有一些情况。是否保证在1-D的情况下对返回的索引进行排序,或者我需要显式地对它们进行排序?(一个类似的问题是,只需使用布尔数组(一个[flag])进行选择即可返回元素的顺序,根据文档,该数组必须相同。) 示例:在flag中查找真实元素之间的“间

我想知道numpy.nonzero/numpy.flatnonzero返回的索引的顺序

我在文件里找不到关于它的任何东西。它只是说:

A[nonzero(flag)] == A[flag]
虽然在大多数情况下,这已经足够了,但当您需要索引的排序列表时,也有一些情况。是否保证在1-D的情况下对返回的索引进行排序,或者我需要显式地对它们进行排序?(一个类似的问题是,只需使用布尔数组(一个[flag])进行选择即可返回元素的顺序,根据文档,该数组必须相同。)

示例:在flag中查找真实元素之间的“间隙”:

flag=np.array([True,False,False,True],dtype=bool)
iflag=flatnonzero(flag)
gaps= iflag[1:] - iflag[:-1]

谢谢。

鉴于的规范,保证
A[nonzero(flag)]==A[flag]
也是保证值在一维情况下从低到高排序。但是,在更高的维度中,结果(虽然“排序”)的结构与您预期的不同

简言之,给定要索引的一维整数数组
ind
和一维数组
x
,我们为
ind
定义的所有有效
i
都有以下内容:

result[i] = x[ind[i]]
result
的形状为
ind
,在
ind
指示的索引处包含
x
的值。这意味着我们可以推断,如果
x[flag]
保持
x
的原始顺序,并且如果
x[nonzero(flag)]
x[flag]
相同,那么
nonzero(flag)
必须始终按排序顺序生成索引

唯一需要注意的是,对于多维数组,索引存储为每个被索引维度的不同数组。换句话说

x[array([0, 1, 2]), array([0, 0, 0])]
等于

array([x[0, 0], x[1, 0], x[2, 0]])
这些值仍然被排序,但每个维度都被分解成自己的数组。(因此,您可以通过广播做一些有趣的事情;但这超出了本答案的范围。)


这条推理路线的唯一问题是——令我大吃一惊的是——我找不到一条明确的语句来保证布尔索引保持数组的原始顺序。尽管如此,根据我的经验,我非常肯定这是真的。更一般地说,让
x[[True,True,True]]
返回
x
的反向版本是令人难以置信的反常

如果它没有被排序,我会非常惊讶……如果A=[[5,6],[7,8],[flag=[[True,True],[True,False]],那么[flag]的结果总是看起来是[5,6,7],即使A是以class='F'顺序创建的。我猜这个顺序实际上是从flatiter继承的,它说“迭代是以C-连续样式完成的,最后一个索引变化最快。”但有人应该确认这一点。我理解整数索引是如何工作的,但在布尔索引和布尔->整数索引转换的情况下,仍然看不到任何顺序的保证。如果A=[5,6,7,8]和flag=[True,False,False,True],那么什么能保证A[flag]=[5,8],flatnonzero(flag)=[0,3],而不是flatnonzero(flag)=[8,5],而flatnonzero(flag)=[3,0]。似乎我误解了你的问题——它说的是“根据文档,哪一个必须是相同的”,我解释为“这一个必须是相同的[与原文一样的]根据文件”。请参见编辑。