Вычтите вектор столбца из матрицы в указанном векторе столбцов, используя только трансляцию - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу вычесть вектор столбца из простой матрицы, используя другой вектор, который является индексом столбцов, где первый вектор столбца необходимо вычесть из основной матрицы.Например,

M = array([[  1,   2,   1,   1],
           [  2,   1,   1,   1],
           [  1,   1,   2,   1],
           [  2,   1,   1,   1],
           [  1,   1,   1,   2]])  # An example matrix

V = array([1, 1, 1, 1, 1]) # An example column vector

I = array([0, 3, 2, 3, 1, 3, 3]) # The index maxtrix

Теперь я хочу вычесть V из M в числах столбцов, указанных в I. Например.I [0] равно 0, поэтому вычтите V из первого столбца (нулевой индекс) матрицы M.

Аналогично I [1] = 3 вычтите V из четвертого столбца (три индекса) матрицы M.

В конце операции, так как 3 встречается 4 раза в I, поэтому V будет вычтено из третьего столбца, т. Е. Последнего столбца M-4 раза.

Мне нужносделать это, используя только широковещание, без петель.

Я пробовал следующее:

M[:, I] - V[np.newaxis, :].T

, но в результате получается широковещательная результирующая матрица, имеющая больше столбцов, чем в M.

Ответы [ 2 ]

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

Можно использовать bincount и outer

>>> M - np.outer(V, np.bincount(I, None, M.shape[1]))
array([[ 0,  1,  0, -3],
       [ 1,  0,  0, -3],
       [ 0,  0,  1, -3],
       [ 1,  0,  0, -3],
       [ 0,  0,  0, -2]])

или subtract.at

>>> out = M.copy()
>>> np.subtract.at(out, (np.s_[:], I), V[:, None])
>>> out
array([[ 0,  1,  0, -3],
       [ 1,  0,  0, -3],
       [ 0,  0,  1, -3],
       [ 1,  0,  0, -3],
       [ 0,  0,  0, -2]])
0 голосов
/ 14 ноября 2018

Мы можем использовать np.subtract.at на транспонированном виде M -

np.subtract.at(M.T,I,V)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...