Примените одномерный массив к каждой ячейке двумерного массива, чтобы создать трехмерный массив. - PullRequest
0 голосов
/ 03 ноября 2018

Учитывая двумерный массив и одномерный массив в Numpy:

a = np.array([[1,2,3],[4,5,6]])
b = np.array([2,4,6])

Я бы хотел вычесть a - b, но вместо того, чтобы получить:

Out[16]: 
array([[-1, -2, -3],
   [ 2,  1,  0]])

Я хочу это вместо:

array([[[-1, -3, -5], [0, -2, -4], [1, -1, -3]],
       [[2, 0, -2], [3, 1, -1], [4, 2, 0]]])

Как мне сделать это векторизованным (то есть нет для циклов) для скорости?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Вы хотите outer вычитание

>>> np.subtract.outer(a,b)

array([[[-1, -3, -5],
        [ 0, -2, -4],
        [ 1, -1, -3]],

       [[ 2,  0, -2],
        [ 3,  1, -1],
        [ 4,  2,  0]]])
0 голосов
/ 03 ноября 2018

Одно решение -

a[...,np.newaxis]-b 

Это просто трюк с вещанием.

Вместо вычитания из

>>> a
array([[1, 2, 3],
       [4, 5, 6]])

вы отследите от

>>> a[...,np.newaxis]
array([[[1],
        [2],
        [3]],

       [[4],
        [5],
        [6]]])

который имеет форму

>>> a[...,np.newaxis].shape
(2, 3, 1)

в то время как b имеет форму

>>> b.shape
(3,)

Таким образом, правила вещания дадут вам вывод в форме (2,3,3), как вы хотите. Хорошая информация о принципах вещания здесь .

...