4

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

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

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

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

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

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

谢谢。

4

1 回答 1

1

给定使用 integers 进行高级(或“花式”)索引的规范,这A[nonzero(flag)] == A[flag]也是保证在一维情况下值从低到高排序的保证。但是,在更高的维度中,结果(虽然“排序”)具有与您预期不同的结构。

简而言之,给定一个整数ind的一维数组和一个x要索引的一维数组,我们对所有有效的i定义如下ind

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.

于 2013-03-14T15:02:46.480 回答