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

#numpy

#numpy

Вопрос:

Я пытаюсь понять nonzero функцию numpy. Ниже приведен пример приложения:

 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])
  

Комментарии:

1. Ах, так что, рассматривая это как [0, 0] , [1, 0] , и [1, 1] имеет смысл. so zip(arr.nonzero()) предназначены для возврата этих парных индексов.

2. Итак, длина массивов в возвращаемом кортеже равна количеству ненулевых значений, которые находятся в исходном массиве. И количество массивов в возвращаемом кортеже равно количеству измерений в исходном массиве. И если бы я заархивировал результат arr.nonzero() , я бы получил массив индексов для ненулевых элементов. Я думаю, что это тоже то, что np.transpose(np.nonzero(arr) возвращает: массив индексов для ненулевых значений в arr. Мне нравится ваш пример arr[arr.nonzero()] получения массива самих ненулевых значений.