numpy logical_and и logical_or - это ufuncs, которые вы хотите (я думаю)
Обратите внимание, что & не logical and, оно побитовоеand. Это все еще работает для вас, потому что (a > 10) возвращает логический массив (например, 1 и 0), как и ваше второе условие. Таким образом, в этом случае "логические" и "побитовые и" эквивалентны (то же самое с логическим и побитовым or). Но в других случаях побитовые операции могут приводить к неожиданным результатам (главным образом потому, что операторы python & и | имеют более низкий приоритет, чем ожидалось в этих контекстах).