Разность между ненулевым (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)
? Разве они не вернут тот же самый результат?
Ответы
Ответ 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: Исправлен первый пример... моя логика была некорректной ранее