Почему не работает мульти-условная маска? - PullRequest
0 голосов
/ 14 октября 2019

Предполагается, что у меня есть пустой массив X, элемент из него x и допуск с именем dx. Я хотел бы создать маску для наблюдения y значений вокруг этого элемента, поэтому я делаю:

for x in X:
    window = (x-dx/2 <= X <= x+dx/2)   
    for y in Y[window]:
        ... 

Почему происходит сбой второй строки?

Если я использую window = (x-dx/2 <= X) & (X <= x+dx/2), это работаетно это менее читабельно. Также возможно использовать window = np.logical_and(x-dx/2 <= X, X <= x+dx/2) для увеличения производительности при работе с большими массивами, и это еще менее читабельно.

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

Выражение, такое как x < y < z, оценивается в 2 этапа:

  1. Сначала (x < y).__bool__() оценивается. Если возвращается True, перейдите к шагу 2, а если возвращается False, то x < y < z равно False. Если он возвращает что-то еще, тогда TypeError повышается. (x < y).__bool__() также может вызвать какое-то исключение.
  2. Если (x < y).__bool__() вернул True, то y < z оценивается. В этом случае значение x < y < z совпадает с y < z. Опять же, может возникнуть исключение.

Проблема возникает на шаге 1, если x или y представляет собой массив numpy с несколькими элементами . Разработчики numpy чувствовали, что не было «хорошего» способа превратить массив с несколькими элементами в одно значение bool, и поэтому они решили не позволять вам, если ndarray.__bool__() поднять ValueError.

Примечание: из-за порядка оценки, описанного выше, вы можете поместить массив numpy в положение z, например:

>>> 1 < 2 < np.arange(5)
array([False, False, False, True, True])
1 голос
/ 14 октября 2019

Очевидно, что numpy не поддерживает составные операторы, такие как a < arr < b.

In [1]: import numpy as np

In [2]: arr = np.arange(10)

In [3]: 3 < arr < 7
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

In [4]: (3 < arr) & (arr < 7)
Out[4]:
array([False, False, False, False,  True,  True,  True, False, False, False])

Составная запись работает с простыми числами, поэтому ожидать, что вышеприведенное сработает, было не лишним. Возможно, кто-то еще может объяснить, почему это не было реализовано в numpy.

In [5]: 3 < 2 < 7, 3 < 6 < 7
Out[5]: (False, True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...