Я пытаюсь выполнить некоторые вычисления, но не могу понять, как векторизовать свой код и не использовать циклы.
Позвольте мне объяснить: у меня есть матрица M[N,C]
из любого 0
или 1
. Еще одна матрица Y[N,1]
содержащие значения [0,C-1]
(Мои занятия). Еще одна матрица ds[N,M]
это мой набор данных.
Моя выходная матрица имеет размер grad[M,C]
и должно быть рассчитано следующим образом: я объясню для grad[:,0]
, та же логика для любого другого столбца.
Для каждой строки(образца) в ds
, если Y[that sample] != 0
(Текущий столбец выходной матрицы) и M[that sample, 0] > 0
, тогда grad[:,0] += ds[that sample]
Если Y[that sample] == 0
, тогда grad[:,0] -= (ds[that sample] * <Num of non zeros in M[that sample,:]>
)
Вот мой итеративный подход:
for i in range(M.size(dim=1)):
for j in range(ds.size(dim=0)):
if y[j] == i:
grad[:,i] = grad[:,i] - (ds[j,:].T * sum(M[j,:]))
else:
if M[j,i] > 0:
grad[:,i] = grad[:,i] + ds[j,:].T