Почему я получаю так много индексов, когда 2D ndarray передается в ненулевую функцию? - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь найти ненулевые элементы в 2D-массиве.Когда я передавал свой массив в функцию np.nonzero (), я получал один и тот же индекс несколько раз.

import numpy as np
ar1 = np.array([[4,7,3,0,0,1],[4,1,1,0,1,6]])
items_not_zero = np.nonzero(ar1)
print(items_not_zero)
# (array([0, 0, 0, 0, 1, 1, 1, 1, 1]), array([0, 1, 2, 5, 0, 1, 2, 4, 5]))

Я ожидал получить кортеж с индексами ненулевых элементов только один раз..

Ответы [ 2 ]

1 голос
/ 16 июня 2019

np.nonzero возвращает массив для каждого измерения переданного массива. В вашем примере

 (array([0, 0, 0, 0, 1, 1, 1, 1, 1]), array([0, 1, 2, 5, 0, 1, 2, 4, 5]))

соответствует индексам:

[(0, 0), (0, 1), (0, 2), (0, 5), (1, 0), (1, 1), (1, 2), (1, 4), (1, 5)]

… первый массив соответствует координате [0], а следующий соответствует измерению [1] каждого кортежа.

Вы можете zip все вместе или, как упоминается в документации, вы можете получить список кортежей с помощью:

print(np.transpose(np.nonzero(ar1)))
0 голосов
/ 16 июня 2019

Во-первых, вы должны взглянуть на страницу документации для numpy.nonzero.

По сути, то, что возвращает nonzero, это кортеж массивов, сразу пригодных для индексации:

ar1[(np.array([0, 0, 0, 0, 1, 1, 1, 1, 1]), np.array([0, 1, 2, 5, 0, 1, 2, 4, 5]))]
# array([4, 7, 3, 1, 4, 1, 1, 1, 6])

Это означает, что количество возвращаемых массивов равно количеству измерений вашего массива (например, ar1 - это двумерный массив), и каждая группа чисел в той же позиции является индексом воригинальный массив.Например, третьим элементом этих массивов являются 0 и 2 соответственно, что означает, что arr[0][2] не равен нулю.

Простой способ сделать результат более «читабельным», как упоминается на странице документации, этотранспонировать это:

np.transpose(np.nonzero(ar1))
'''
array([[0, 0],
       [0, 1],
       [0, 2],
       [0, 5],
       [1, 0],
       [1, 1],
       [1, 2],
       [1, 4],
       [1, 5]])
'''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...