r
- массив numpy (rec). Таким образом, r["dt"] >= startdate
также является (булевым) массивом. Для numpy-массивов операция &
возвращает побитовое и двух булевых массивов.
Разработчики NumPy считают, что не было общепринятого способа оценки массива в булевом контексте: это может означать True
, если любой элемент равен True
, или это может означать True
, если все элементы True
или True
, если массив имеет ненулевую длину , просто для того, чтобы назвать три возможности.
Поскольку разные пользователи могут иметь разные потребности и разные предположения, разработчики NumPy отказались догадываться и вместо этого решили поднять ValueError всякий раз, когда кто-то пытается оценить массив в булевом контексте. Применение and
к двум массивам numpy приводит к оценке двух массивов в булевом контексте (путем вызова __bool__
в Python3 или __nonzero__
в Python2).
Ваш исходный код
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]
выглядит правильно. Однако, если вы хотите and
, вместо a and b
используйте (a-b).any()
или (a-b).all()
.