Numpy非零/ flatnonzero指数顺序;布尔索引中返回元素的顺序

时间:2013-03-14 14:29:14

标签: python numpy

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

我在文档中找不到任何关于它的内容。它只是说:

A[nonzero(flag)] == A[flag]

虽然在大多数情况下这已足够,但有些时候你需要一个排序的索引列表。是否保证返回的索引在1-D的情况下排序,或者我需要明确地对它们进行排序? (类似的问题是简单地通过选择一个布尔数组(A [flag])返回的元素的顺序,根据文档必须相同。)

示例:找到"间隙"标志中的真元素之间:

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

感谢。

1 个答案:

答案 0 :(得分:1)

鉴于advanced (or "fancy") indexing with integers的规范,保证A[nonzero(flag)] == A[flag]也保证在1-d情况下值从低到高排序。但是,在更高的维度中,结果(而#34;排序")具有与您预期不同的结构。

简而言之,给定一个整数的一维数组ind和一个要编入索引的一维数组x,我们为{{i定义了所有有效ind 1}}:

result[i] = x[ind[i]]

result采用ind的形状,并在x指示的索引处包含ind的值。这意味着我们可以推断,如果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的反转版本将是令人难以置信的反常