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
.
Замечание
Данная функция так же реализована в виде метода базового класса 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]])