numpy.compress

numpy.compress(condition, a, axis=None, out=None)

Функция compress() возвращает указанные (полные) срезы массива вдоль заданной оси.

Параметры:
condition - массив NumPy или подобный массиву объект.
Одномерный булев массив который определяет критерий выбора срезов: True - извлечь; False - оставить. Если длина condition меньше чем длина указанной оси массива a, то данная ось усекается до длины condition.
a - массив NumPy или подобный массиву объект.
Массив из которого выбираются срезы.
axis - целое число (необязательный параметр).
Ось вдоль которой извлекаются срезы. Если axis = None, то элементы извлекаются из сжатого до одной оси представления массива a.
out - массив NumPy (необязательный параметр).
Позволяет сразу напрямую поместить результат в указанный массив, при условии, что он имеет подходящую форму и тип данных.
Возвращает:
ndarray - массив NumPy
массив, состоящий из указанных в condition срезов взятых вдоль оси axis исходного массива a.
Смотрите так же:
choose, take, select, diagonal, diag

Замечание

Данная функция так же реализована в виде метода базового класса ndarray.compress() с аналогичной сигнатурой (ndarray.compress(condition, a, axis=None, out=None)) и принципом работы.

Не вдаваясь во все подробности, стоит заметить, что массив condition вне зависимости от типа его элементов будет восприниматься как логический, т.е. не имеет значения какой это элемент в нем находится, имеет значение ложный он или истинный. Например, с виду разные массивы condition приведут к одному и тому же результату:

>>> import numpy as np
>>> 
>>> a = np.arange(24).reshape(4, 6)
>>> a
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])
>>> 
>>> 
>>> np.compress([0, 1, 0, 1], a, axis = 0)
array([[ 6,  7,  8,  9, 10, 11],
       [18, 19, 20, 21, 22, 23]])
>>>
>>> np.compress([False, True, False, True], a, axis = 0)
array([[ 6,  7,  8,  9, 10, 11],
       [18, 19, 20, 21, 22, 23]])
>>> 
>>> np.compress([0, 5, 0, 5], a, axis = 0)
array([[ 6,  7,  8,  9, 10, 11],
       [18, 19, 20, 21, 22, 23]])
>>> 
>>> np.compress(['', 'foo', '', 'bar'], a, axis = 0)
array([[ 6,  7,  8,  9, 10, 11],
       [18, 19, 20, 21, 22, 23]])



Примеры

Если параметр axis не указан, то элементы будут извлекаться из сжатого до одной оси массива:

>>> import numpy as np
>>> 
>>> a = np.arange(24).reshape(4, 6)
>>> a
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])
>>> 
>>> np.compress([0, 1, 0, 1], a)
array([1, 3])

Если же axis указано, то срезы будут извлечены вдоль указанной оси:

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

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])
>>> 
>>> 
>>> np.compress([1, 0, 1], a, axis = 2)
array([[[ 0,  2],
        [ 3,  5],
        [ 6,  8]],

       [[ 9, 11],
        [12, 14],
        [15, 17]],

       [[18, 20],
        [21, 23],
        [24, 26]]])
>>> 
>>> np.compress([1, 0, 1], a, axis = 1)
array([[[ 0,  1,  2],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [15, 16, 17]],

       [[18, 19, 20],
        [24, 25, 26]]])
>>> 
>>> np.compress([1, 0, 1], a, axis = 0)
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

Параметр out позволяет выгружать результат напрямую в указанный массив, минуя операцию присваивания, что позволяет несколько ускорить выполнение программы, особенно в циклах:

>>> b = np.r_[:6].reshape(3, 2)
>>> b
array([[0, 1],
       [2, 3],
       [4, 5]])
>>> 
>>> out_arr = np.ones((3, 1), dtype = np.int)
>>> out_arr
array([[1],
       [1],
       [1]])
>>> 
>>> np.compress([0, 1], b, axis = 1, out = out_arr)
array([[1],
       [3],
       [5]])
>>> 
>>> out_arr
array([[1],
       [3],
       [5]])

Обратите внимание на то, что форма и тип данных как возвращаемого массива, так и массива в который помещается результат должны полностью совпадать.

Данная функция может быть вызвана как метод:

>>> np.compress([0, 1], b, axis = 1)
array([[1],
       [3],
       [5]])
>>> 
>>> b.compress([0, 1], axis = 1)
array([[1],
       [3],
       [5]])