numpy.choose#

numpy.выбрать(a, choices, выход=None, mode='raise')[источник]#

Создать массив из индексного массива и списка массивов для выбора.

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

np.choose(a,c) == np.array([c[a[I]][I] for I in np.ndindex(a.shape)])

Но это упускает некоторые тонкости. Вот полное общее описание:

Учитывая «индексный» массив (a) целых чисел и последовательность n массивы (choices), a и каждый массив выбора сначала транслируются, если необходимо, к массивам общей формы; вызывая эти Ba и Bchoices[i], i = 0,…,n-1 у нас есть, что обязательно, Ba.shape == Bchoices[i].shape для каждого i. Затем новый массив с формой Ba.shape создаётся следующим образом:

  • if mode='raise' (по умолчанию), тогда, прежде всего, каждый элемент a (и, следовательно, Ba) должен быть в диапазоне [0, n-1]; теперь предположим, что i (в этом диапазоне) является значением в (j0, j1, ..., jm) позиция в Ba - тогда значение в той же позиции в новом массиве является значением в Bchoices[i] в той же позиции;

  • if mode='wrap', значения в a (и, следовательно, Ba) может быть любым (знаковым) целым числом; для отображения целых чисел вне диапазона используется модульная арифметика [0, n-1] обратно в этот диапазон; и затем новый массив строится как описано выше;

  • if mode='clip', значения в a (и, следовательно, Ba) может быть любым (знаковым) целым числом; отрицательные целые числа отображаются в 0; значения больше n-1 отображаются в n-1; и затем новый массив строится, как описано выше.

Параметры:
aцелочисленный массив

Этот массив должен содержать целые числа в [0, n-1], где n является количеством вариантов, если только mode=wrap или mode=clip, в которых случаях допустимы любые целые числа.

choicesпоследовательность массивов

Массивы выбора. a и все варианты должны быть транслируемы к одной форме. Если choices сам является массивом (не рекомендуется), то его внешнее измерение (т.е., соответствующее choices.shape[0]) принимается как определяющий "последовательность".

выходмассив, опционально

Если предоставлен, результат будет вставлен в этот массив. Он должен быть соответствующей формы и dtype. Обратите внимание, что выход всегда буферизуется, если mode='raise'; используйте другие режимы для лучшей производительности.

mode{'raise' (по умолчанию), 'wrap', 'clip'}, опционально

Определяет, как обрабатывать индексы за пределами [0, n-1] будет обрабатываться:

  • ‘raise’ : вызывается исключение

  • ‘wrap’ : значение становится значением по модулю n

  • ‘clip’ : значения < 0 отображаются в 0, значения > n-1 отображаются в n-1

Возвращает:
merged_arrayмассив

Объединённый результат.

Вызывает:
ValueError: несоответствие формы

Если a и каждый массив выбора не могут быть все транслированы к одной форме.

Смотрите также

ndarray.choose

эквивалентный метод

numpy.take_along_axis

Предпочтительно, если choices является массивом

Примечания

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

Примеры

>>> import numpy as np
>>> choices = [[0, 1, 2, 3], [10, 11, 12, 13],
...   [20, 21, 22, 23], [30, 31, 32, 33]]
>>> np.choose([2, 3, 1, 0], choices
... # the first element of the result will be the first element of the
... # third (2+1) "array" in choices, namely, 20; the second element
... # will be the second element of the fourth (3+1) choice array, i.e.,
... # 31, etc.
... )
array([20, 31, 12,  3])
>>> np.choose([2, 4, 1, 0], choices, mode='clip') # 4 goes to 3 (4-1)
array([20, 31, 12,  3])
>>> # because there are 4 choice arrays
>>> np.choose([2, 4, 1, 0], choices, mode='wrap') # 4 goes to (4 mod 4)
array([20,  1, 12,  3])
>>> # i.e., 0

Несколько примеров, иллюстрирующих, как choose выполняет трансляцию:

>>> a = [[1, 0, 1], [0, 1, 0], [1, 0, 1]]
>>> choices = [-10, 10]
>>> np.choose(a, choices)
array([[ 10, -10,  10],
       [-10,  10, -10],
       [ 10, -10,  10]])
>>> # With thanks to Anne Archibald
>>> a = np.array([0, 1]).reshape((2,1,1))
>>> c1 = np.array([1, 2, 3]).reshape((1,3,1))
>>> c2 = np.array([-1, -2, -3, -4, -5]).reshape((1,1,5))
>>> np.choose(a, (c1, c2)) # result is 2x3x5, res[0,:,:]=c1, res[1,:,:]=c2
array([[[ 1,  1,  1,  1,  1],
        [ 2,  2,  2,  2,  2],
        [ 3,  3,  3,  3,  3]],
       [[-1, -2, -3, -4, -5],
        [-1, -2, -3, -4, -5],
        [-1, -2, -3, -4, -5]]])