Вычитание одномерного массива (списка скаляров) из трехмерных массивов с использованием широковещания - PullRequest
0 голосов
/ 21 января 2019

У меня есть один одномерный массив скалярных значений

Y = np.array([1, 2])

У меня также есть 3-мерный массив:

X = np.random.randint(0, 255, size=(2, 2, 3))

Я пытаюсь вычесть каждое значение Y из X, поэтому я должен получить обратно Z, который должен иметь форму (2, 2, 2, 3) или, возможно, (2, 2, 2, 3).

Кажется, я не могу понять, как это сделать с помощью трансляции.

Я попытался изменить изменение Y:

Y = np.array([[[1, 2]]])

но не уверен, какой должна быть правильная форма.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вещание выравнивает размеры справа.Итак, вы хотите работать с массивом (2, 1, 1, 1) и массивом (2, 2, 3).

Самый простой способ, о котором я могу подумать, это использовать reshape:

Y = Y.reshape(-1, 1, 1, 1)

В более общем смысле:

Y = Y.reshape(-1, *([1] * X.ndim))

Максимум одним из аргументов reshape может быть -1, что указывает на все оставшиеся размеры, не учитываемые другими измерениями.

Чтобы получить Z формы (2, 2, 2, 3):

Z = X - Y.reshape(-1, *([1] * X.ndim))

Если бы вы были в порядке с Z формы (2, 2, 3, 2), операция была бы намного проще:

Z = X[..., None] - Y

None или np.newaxis вставит ось единицы в конец фигуры X, обеспечивая правильную трансляцию с 1D Y.

0 голосов
/ 21 января 2019

Я не совсем уверен, в каком измерении вы хотите, чтобы ваше вычитание имело место, но X - Y не вернет ошибку, если вы определите Y, например Y = numpy.array([1,2]).reshape(2, 1, 1) или Y = numpy.array([1,2]).reshape(1, 2, 1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...