получить индексы n-мерного массива при условии True python [duplicate]

Статические методы распределяются между всеми экземплярами класса, разработчики обычно используют статическое ключевое слово с методами утилиты, которые выполняют некоторые общие функции, которые регулярно используются в любом месте приложения.

Если применяются следующие условия, сделайте свой метод статическим:

  1. Ваш метод выполняет общую функцию, которая регулярно используется во всем приложении.
  2. В вашем методе не используются переменные экземпляра.
  3. Ваш метод принимает входные данные в качестве аргументов, выполняет некоторые общие функции, а затем возвращает некоторый результат.

PS: Стоит упомянуть, что очень сложно или даже (возможно) статический метод, издевательский - это механизм, используемый в модульном тестировании для подделки бизнеса некоторыми методами.

Для получения дополнительной информации проверьте: Статическое ключевое слово в java

26
задан Amelio Vazquez-Reina 12 April 2013 в 17:42
поделиться

2 ответа

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

np.where(mask,a,b)

, которую можно охарактеризовать как numpy «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.

11
ответ дан mgilson 18 August 2018 в 22:55
поделиться
  • 1
    Я не понимаю ваши последние несколько высказываний. np.nonzero(a) возвращает кортеж, поэтому mask.T не разрешен. mask[:,0] аналогичным образом не работает. – Sam 15 April 2013 в 01:24
  • 2
    @Sam - Ты прав. Извини за это. (Я ошибался в том, что он действительно возвращает). Однако точка зрения одинаков. np.argnonzero приятно получить индексы, которые не равны нулю. – mgilson 15 April 2013 в 02:43
  • 3
    «Это может быть более легким, чем создание всей булевой маски, если 0 являются разреженными». - но вам уже нужно создать всю эту булевскую маску, чтобы передать ее в nonzero. – user2357112 29 October 2016 в 02:45
  • 4
    (Кроме того, я думаю, вы смешивали нулевые элементы и ненулевые элементы.) – user2357112 29 October 2016 в 02:46
  • 5
    @ user2357112 Итак ... Трудно сказать, что я имел в виду 3 года назад, когда писал это, но я предполагаю, что индексирование через массив с несколькими элементами будет быстрее индексации с использованием маски, которая имеет n элементы (где n - размер сплющенного массива, который индексируется). Также не купите в пример слишком много. Что, если у вас уже есть подходящий массив mask, сидящий вокруг? – mgilson 29 October 2016 в 02:51

Я не могу прокомментировать полезность наличия отдельной функции удобства, которая переносит результат другого, но я могу прокомментировать 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: Исправлен первый пример ... моя логика была некорректной ранее

9
ответ дан SethMMorton 18 August 2018 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: