Эффективное вычитание numpy массивов разной формы

Используя отличные правила вещания numpy, вы можете вычесть массив shape (3,) v из массива shape (5,3) X с помощью

X - v

Результатом является массив shape (5,3), в котором каждая строка i является разницей X[i] - v.

Есть ли способ вычесть массив формы (n, 3) w из X, чтобы каждая строка w вычиталась из всего массива X без явного использования цикла?


person MaxPowers    schedule 12.11.2015    source источник
comment
Какой будет форма выходного массива?   -  person Divakar    schedule 12.11.2015
comment
Нам нужно вычесть n векторов shape (3,) из массива shape (5,3), чтобы в результате получился массив shape (5,3, n).   -  person MaxPowers    schedule 12.11.2015
comment
Я думаю, это было бы (5,n,3) скорее, нет? Потому что последней осью будут строки.   -  person Divakar    schedule 12.11.2015
comment
На самом деле порядок упорядочивания не имеет значения, поскольку я мог бы использовать swapaxes для достижения желаемого порядка (в моем случае (n, 5,3)).   -  person MaxPowers    schedule 12.11.2015


Ответы (1)


Вам необходимо расширить размеры X с помощью _2 _, чтобы сформировать трехмерный массив, а затем выполнить вычитание на w. Это приведет к включению broadcasting этой 3D операции и на выходе с формой (5,n,3). Реализация будет выглядеть так -

X[:,None] - w  # or X[:,np.newaxis] - w

Вместо этого, если желаемый порядок - (n,5,3), тогда вам нужно вместо этого расширить размеры w, например:

X - w[:,None] # or X - w[:,np.newaxis] 

Пробный прогон -

In [39]: X
Out[39]: 
array([[5, 5, 4],
       [8, 1, 8],
       [0, 1, 5],
       [0, 3, 1],
       [6, 2, 5]])

In [40]: w
Out[40]: 
array([[8, 5, 1],
       [7, 8, 6]])

In [41]: (X[:,None] - w).shape
Out[41]: (5, 2, 3)

In [42]: (X - w[:,None]).shape
Out[42]: (2, 5, 3)
person Divakar    schedule 12.11.2015
comment
Это то что мне нужно! Хорошая идея просто расширить размерность. Спасибо! - person MaxPowers; 12.11.2015