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