Метод choose
Метод choose класса ndarray создает новый массив, выбирая элементы из переданного списка массивов-кандидатов в соответствии с индексами, хранящимися в исходном массиве. Фактически, исходный массив используется как карта индексов: каждый его элемент определяет, из какого массива-кандидата будет взят элемент для результирующего массива.
Синтаксис
arr.choose(choices, [out, mode])
Параметры:
-
choices- список массивов, из которых происходит выборка. Все массивы должны быть либо одномерными, либо иметь форму, транслируемую к форме исходного массива. -
out(необязательный) - массив для записи результата. Если указан, должен иметь форму, совместимую с исходным массивом, и тип данных, способный принять результат. -
mode(необязательный) - определяет поведение при выходе индекса за пределы допустимого диапазона. Может принимать значения'raise'(по умолчанию, выбрасывает исключение),'wrap'(заворачивает индекс по модулю длины списка choices) или'clip'(ограничивает индекс максимальным значением).
Пример
Давайте создадим массив индексов и два массива-кандидата, из которых метод будет выбирать элементы:
import numpy as np
indices = np.array([0, 1, 0, 1])
a = np.array([10, 20, 30, 40])
b = np.array([100, 200, 300, 400])
res = indices.choose([a, b])
print(res)
Результат выполнения кода:
[ 10 200 30 400]
Для каждого индекса из массива indices берется соответствующее значение: для 0 - из a, для 1 - из b.
Пример
Исходный массив может быть многомерным. В этом случае выборка происходит поэлементно:
import numpy as np
indices = np.array([[0, 1], [1, 0]])
a = np.array([100, 200])
b = np.array([1000, 2000])
res = indices.choose([a, b])
print(res)
Результат выполнения кода:
[[ 100 2000]
[2000 200]]
Пример
Если массив-кандидат многомерный, его форма должна быть транслируема к форме исходного массива. В этом случае выборка работает аналогично:
import numpy as np
indices = np.array([[0, 1], [1, 0]])
a = np.array([[10, 20], [30, 40]])
b = np.array([[100, 200], [300, 400]])
res = indices.choose([a, b])
print(res)
Результат выполнения кода:
[[ 10 200]
[300 40]]
Пример
Рассмотрим использование параметра mode. При значении 'wrap' индекс оборачивается по модулю длины списка choices:
import numpy as np
indices = np.array([0, 1, 2, 3])
choices = [np.array([10, 20, 30, 40]), np.array([100, 200, 300, 400])]
res = indices.choose(choices, mode='wrap')
print(res)
Результат выполнения кода:
[ 10 200 30 400]
Индекс 2 был преобразован в 0, так как 2 % 2 = 0, а индекс 3 - в 1.
При значении 'clip' все индексы, превышающие максимальный допустимый, заменяются на максимальный индекс:
import numpy as np
indices = np.array([0, 1, 2, 3])
choices = [np.array([10, 20, 30, 40]), np.array([100, 200, 300, 400])]
res = indices.choose(choices, mode='clip')
print(res)
Результат выполнения кода:
[ 10 200 300 400]
Индексы 2 и 3 были заменены на максимально допустимый индекс 1.