Допустим, вы хотите добавить что-то ко всем элементам, кратным 3. Вместо итерации по всем элементам массива, мы обычно используем mask
In [355]: x = np.arange(12).reshape(3,4)
In [356]: mask = (x%3)==0
In [357]: mask
Out[357]:
array([[ True, False, False, True],
[False, False, True, False],
[False, True, False, False]])
In [358]: x[mask] += 100
In [359]: x
Out[359]:
array([[100, 1, 2, 103],
[ 4, 5, 106, 7],
[ 8, 109, 10, 11]])
Многие операции ufunc
, который имеет where
параметр
In [360]: x = np.arange(12).reshape(3,4)
In [361]: np.add(x,100, where=mask, out=x)
Out[361]:
array([[100, 1, 2, 103],
[ 4, 5, 106, 7],
[ 8, 109, 10, 11]])
Fast numpy
, требует, чтобы мы мыслили в терминах целого массива. Быстрый скомпилированный код работает с массивами или блоками массивов. Python Уровень итерации на массивах медленный, медленнее, как вы узнали, что итерация на списках. Доступ к отдельным значениям массива обходится дороже.
В этом небольшом примере эти методы для всего массива быстрее, чем итерация массива, хотя они все еще медленнее, чем итерация списка. Но методы массива скалярные гораздо лучше.