Подтвердить что ты не робот

Разность между ненулевым (a), где (a) и argwhere (a). Когда использовать какой?

В Numpy, nonzero(a), where(a) и argwhere(a), причем a является массивом numpy, все, кажется, возвращают ненулевые индексы массива. Каковы различия между этими тремя вызовами?

  • В argwhere в документации говорится:

    np.argwhere(a) совпадает с np.transpose(np.nonzero(a)).

    Почему есть целая функция, которая просто переносит вывод nonzero? Когда это будет настолько полезно, что он заслуживает отдельной функции?

  • Как насчет разницы между where(a) и nonzero(a)? Разве они не вернут тот же самый результат?

4b9b3361

Ответ 1

nonzero и argwhere обе дают вам информацию о том, где в массиве находятся элементы True. where работает так же, как nonzero в форме, которую вы разместили, но имеет вторую форму:

np.where(mask,a,b)

который можно охарактеризовать как бесчисленную версию условного выражения "ufunc":

a[i] if mask[i] else b[i]

(при соответствующем широковещании a и b).

Что касается как nonzero, так и argwhere, они концептуально отличаются. nonzero структурирован для возврата объекта, который можно использовать для индексирования. Это может быть более легким, чем создание всей булевой маски, если 0 разрежены:

mask = a == 0  # entire array of bools
mask = np.nonzero(a)

Теперь вы можете использовать эту маску для индексации других массивов и т.д. Однако, как бы то ни было, не очень приятно концептуально выяснить, какие индексы соответствуют 0 элементам. Это где argwhere входит.

Ответ 2

Я не могу прокомментировать полезность наличия отдельной функции удобства, которая переносит результат другого, но могу прокомментировать where vs nonzero. В этом простейшем случае использования where действительно совпадает с nonzero.

>>> np.where(np.array([[0,4],[4,0]]))
(array([0, 1]), array([1, 0]))
>>> np.nonzero(np.array([[0,4],[4,0]]))
(array([0, 1]), array([1, 0]))

или

>>> a = np.array([[1, 2],[3, 4]])
>>> np.where(a == 3)
(array([1, 0]),)
>>> np.nonzero(a == 3)
(array([1, 0]),)

where отличается от nonzero в том случае, если вы хотите выбрать элементы из массива a, если какое-либо условие True и из массива b, когда это условие False.

>>> a = np.array([[6, 4],[0, -3]])
>>> b = np.array([[100, 200], [300, 400]])
>>> np.where(a > 0, a, b)
array([[6, 4], [300, 400]])

Опять же, я не могу объяснить, почему они добавили функциональность nonzero в where, но это, по крайней мере, объясняет, как эти два разных.

EDIT: Исправлен первый пример... моя логика была некорректной ранее