我正在尝试理解numpy的nonzero
函数。以下是一个示例应用程序:
import numpy
arr = numpy.array([[1,0],[1,1]])
arr.nonzero()
--> (array([0, 1, 1]), array([0, 0, 1]))
我可以看到,因为arr
是2-D,nonzero()
的输出是2元组。但是,我不明白为什么元组的每个元素中的索引数超过了数组的行数/列数。我可以看到
arr[arr.nonzero()]
--> array([1, 1, 1])
但是怎么......?
答案 0 :(得分:28)
元组的每个元素都包含每个非零值的索引之一。因此,每个元组元素的长度是数组中非零的数量。
在您的示例中,非零的索引为[0, 0]
,[1, 0]
和[1, 1]
。元组的第一个元素是每个非零值的第一个索引:([0, 1, 1])
,元组的第二个元素是每个非零值的第二个索引:([0, 0, 1])
。
你的第二个代码块只返回数组的非零值(如果返回值是混淆的一部分,我不清楚问题。)
>>> arr[arr.nonzero()]
array([1, 1, 1])
如果我们将示例数组与其他值一起使用,则会更清楚。
>>> arr = numpy.array([[1,0],[2,3]])
>>> arr[arr.nonzero()]
array([1, 2, 3])