Python: Использование оператора равенства внутри присваивания массива Numpy - PullRequest
0 голосов
/ 05 апреля 2019

Я видел этот код в некоторых примерах онлайн и пытаюсь понять и изменить его:

c = a[b == 1]
  1. Почему это работает? Похоже, b == 1 возвращает true для каждого элемента b, который удовлетворяет равенству. Я не понимаю, как что-то вроде a[True] заканчивается вычислением чего-то вроде «Для всех значений в a, для которых одинаковое индексированное значение в b равно 1, скопируйте их в c»

a, b и c - все массивы NumPy одинаковой длины, содержащие некоторые данные. Я довольно долго искал, но даже не знаю, как это назвать.

  1. Если я хочу добавить второе условие, например:
c = a[b == 1 and d == 1]

Я получаю

ValueError: Значение истинности массива с более чем одним элементом является неоднозначным. Используйте a.any () или a.all ()

Я знаю, что это происходит потому, что эта комбинация операций равенства неоднозначна по причинам, объясненным здесь , но я не уверен, как добавить a.any() или a.all() в это выражение в одну строку.

РЕДАКТИРОВАТЬ :

На вопрос 2 c = a[(b == 1) & (d == 1)] работает. Любой вклад в мой первый вопрос о том, как / почему это работает?

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Почему не работает ваш пример в пункте (1)? Это Булево индексирование . Если массивы были разных форм, то это может быть другое дело, но:

c = a[b == 1]

неотличим от:

c = a[a == 1]

Когда вы не знаете настоящие массивы. Ничего конкретного для a здесь не происходит; a == 1 просто устанавливает логическую маску, которую вы затем повторно применяете к a в a[mask_here]. Не имеет значения, что сгенерировало маску.

0 голосов
/ 05 апреля 2019

Вам просто нужно указать условия отдельно в скобках.Попробуйте использовать это

c = a[(b == 1) & (d == 1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...