了解NumPy的非零函数

hat*_*rix 23 numpy

我想了解numpy的nonzero功能.以下是一个示例应用程序:

import numpy
arr = numpy.array([[1,0],[1,1]])
arr.nonzero()
--> (array([0, 1, 1]), array([0, 0, 1]))
Run Code Online (Sandbox Code Playgroud)

我可以看到,因为arr是2-D,输出nonzero()是2元组.但是,我不明白为什么元组的每个元素中的索引数超过了数组的行数/列数.我知道

arr[arr.nonzero()]
--> array([1, 1, 1])
Run Code Online (Sandbox Code Playgroud)

但是......怎么样?

Dav*_*ber 30

元组的每个元素都包含每个非零值的索引之一.因此,每个元组元素的长度是数组中非零的数量.

从你的例子中,非零的指数[0, 0],[1, 0][1, 1].元组的第一个元素是每个非零值的第一个索引:([0, 1, 1])元组的第二个元素是每个非零值的第二个索引:([0, 0, 1]).

你的第二个代码块只返回数组的非零值(如果返回值是混淆的一部分,我不清楚问题).

>>> arr[arr.nonzero()]
array([1, 1, 1])
Run Code Online (Sandbox Code Playgroud)

如果我们将示例数组与其他值一起使用,则会更清楚.

>>> arr = numpy.array([[1,0],[2,3]])
>>> arr[arr.nonzero()]
array([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

  • 啊,所以把它视为`[0,0]`,`[1,0]`和`[1,1]`是有道理的.所以`zip(arr.nonzero())`意味着返回这些配对索引. (4认同)