Подтвердить что ты не робот

Numpy вычесть каждую строку матрицы вектором

Итак, у меня есть матрица n x d и n x 1. Я пытаюсь написать код для вычитания каждой строки в матрице вектором.

В настоящее время у меня есть цикл for, который выполняет итерацию и вычитает вектор i -th в матрице. Есть ли способ просто вычесть всю матрицу вектором?

Спасибо!

Текущий код:

for i in xrange( len( X1 ) ):
    X[i,:] = X1[i,:] - X2

Здесь X1 находится матрица i -я строка, а X2 - вектор. Могу ли я сделать это так, чтобы мне не нужен цикл for?

4b9b3361

Ответ 1

Это работает в numpy, но , только если конечные оси имеют одинаковую размерность. Вот пример успешного вычитания вектора из матрицы:

In [27]: print m; m.shape
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
Out[27]: (4, 3)

In [28]: print v; v.shape
[0 1 2]
Out[28]: (3,)

In [29]: m  - v
Out[29]: 
array([[0, 0, 0],
       [3, 3, 3],
       [6, 6, 6],
       [9, 9, 9]])

Это работало, потому что задняя ось обоих имела тот же размер (3).

В вашем случае ведущие оси имеют одинаковый размер. Вот пример, используя тот же v, что и выше, о том, как это можно исправить:

In [35]: print m; m.shape
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
Out[35]: (3, 4)

In [36]: (m.transpose() - v).transpose()
Out[36]: 
array([[0, 1, 2, 3],
       [3, 4, 5, 6],
       [6, 7, 8, 9]])

Правила для широковещательных осей подробно описаны здесь.

Ответ 2

В дополнение к ответу @John1024, "перенос" одномерного вектора в numpy можно сделать следующим образом:

In [1]: v = np.arange(3)

In [2]: v
Out[2]: array([0, 1, 2])

In [3]: v = v[:, np.newaxis]

In [4]: v
Out[4]:
array([[0],
       [1],
       [2]])

Отсюда вычитание v из каждого столбца m тривиально, используя широковещание:

In [5]: print(m)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

In [6]: m - v
Out[6]:
array([[0, 1, 2, 3],
       [3, 4, 5, 6],
       [6, 7, 8, 9]])