numpy.putmask

numpy.putmask(a, mask, values)

Функция putmask() изменяет элементы массива на указанные значения в зависимости от выполнения заданных условий.

Данная функция во многом аналогична функции numpy.place(), но в отличии от нее на маску не накладывается ограничение по форме, а только по размеру, так как и маска и исходный массив сжимаются до одной оси, т.е. все замены выполняются по правилу a.flat[n] = values[n] для всех n, которые удовлетворяют условию mask.flat[n]==True.

Параметры:
a - массив NumPy.
Исходный массив.
mask - массивов NumPy или массивоподобный объект.
Булев массив того же размера, что и a, который является маской для исходного массива и определяет какие элементы должны быть заменены: True - замена выполняется, False - элемент остается без изменений.
values - одномерный массив NumPy, массивоподобный объект или скалярное значение.
Содержит элементы для вставки в исходный массив. Данный массив может быть любой длины, так как используются только первые n элементов, где n - это количество истинных значений в mask, если длина values меньше чем n, то перебор значений для вставки будет выполняться циклически. Данная последовательность может быть пустой, только если все элементы в mask равны False.
Возвращает:
Данная функция ничего не возвращает, а сразу изменяет исходный массив a.
Смотрите так же:
place, put, put_along_axis, take, copyto


Примеры

Исходный массив a и его маска могут иметь разную форму, но должны быть одинакового размера (содержать одинаковое количество элементов):

>>> import numpy as np
>>> 
>>> a = np.ones((2, 2))
>>> a
array([[1., 1.],
       [1., 1.]])
>>> 
>>> mask = [True, False, True, False]
>>> 
>>> np.putmask(a, mask, 77)
>>> a
array([[77.,  1.],
       [77.,  1.]])

Если значений в values меньше чем значений True в mask, то значения будут вставляться циклически:

>>> a = np.arange(8)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> 
>>> np.putmask(a, a > 2, [777, 555])
>>> a
array([  0,   1,   2, 555, 777, 555, 777, 555])

С другой стороны, если значений в values больше чем значений True в mask, то будут вставлены не все значения:

>>> a = np.arange(8)
>>> np.putmask(a, a < 2, [777, 555, 333, 111])
>>> a
array([777, 555,   2,   3,   4,   5,   6,   7])