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]]])