Количество временных массивов может быть больше, чем вы думаете:
In [224]: x = np.array([[1, 2], [2, 4], [3, 6]])
In [225]: x % 2
Out[225]:
array([[1, 0],
[0, 0],
[1, 0]])
In [226]: _ == 0
Out[226]:
array([[False, True],
[ True, True],
[False, True]])
In [227]: np.all(_, axis=1)
Out[227]: array([False, True, False])
In [228]: np.any(_)
Out[228]: True
В этом случае рабочая строка за строкой сэкономит на вычислении значений последней строки.
Последний шаг any
может закорачиваться, останавливаясь при достижении True
- это подробности реализации.
Тщательный итеративный метод без лишних вычислений будет выглядеть примерно так:
In [231]: val = False
...: for row in x:
...: for col in row:
...: if col%2!=0:
...: break
...: val=(row,col)
...: break
In [232]: val
Out[232]: (array([2, 4]), 2)
Этот подход имел бы смысл, если бы я писал на языке C или на языке lisp
, где тестирование, управление памятью и вычисления выполняются на одном уровне кода. Но это не было бы очень модульным или многоразовым.
Идея, лежащая в основе numpy
, заключается в предоставлении полного набора скомпилированных строительных блоков. Эти блоки не будут оптимальными для всех задач, но в целом они быстры и просты в использовании.
Обычно рекомендуется использовать данные строительные блоки для быстрой разработки. Как только он заработает, подумайте об улучшении скорости критических по времени шагов.