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
?
Ответы
Ответ 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]])