Понимание ненулевой функции NumPy

Я пытаюсь понять функцию 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])

Но как...?

Ответы

Ответ 1

Каждый элемент кортежа содержит один из индексов для каждого ненулевого значения. Следовательно, длина каждого элемента кортежа - это количество ненулевых элементов в массиве.

В вашем примере индексы ненулевых значений [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])