Умножение столбцов матрицы на матрицу в numpy - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь вычислить эту операцию более эффективным способом:

y = np.array([xi*M for xi in x.T])

, где x - матрица (m,n) и M матрица (m,m). Вывод y имеет форму (n,m,m), с каждым y[i,:,:] = np.multiply(x[:,i],M).

Я думал об использовании einsum, но мне трудно понять, как это сделать с нижним индексом.

Ответы [ 3 ]

2 голосов
/ 04 марта 2020

Хорошее введение в einsum здесь http://ajcr.net/Basic-guide-to-einsum.

Индексация для вашего случая:

np.einsum('ik,jk->ijk', x.T, M)

Ниже простой тест:

m, n = 3, 2
x = np.arange(n*m).reshape((m, n))
M = np.arange(m*m).reshape((m,m))
x
array([[0, 1],
       [2, 3],
       [4, 5]])

M
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

y = np.array([xi*M for xi in x.T])

y
array([[[ 0,  2,  8],
        [ 0,  8, 20],
        [ 0, 14, 32]],

       [[ 0,  3, 10],
        [ 3, 12, 25],
        [ 6, 21, 40]]])
np.einsum('ik,jk->ijk', x.T, M)
array([[[ 0,  2,  8],
        [ 0,  8, 20],
        [ 0, 14, 32]],

       [[ 0,  3, 10],
        [ 3, 12, 25],
        [ 6, 21, 40]]])
0 голосов
/ 04 марта 2020

Без использования einsum (просто basi c вещание ):

# Example
# m, n = 5, 3
# M = np.random.rand(m,m)
# x = np.random.rand(m,n)

y = x.T[:,None] * M
0 голосов
/ 04 марта 2020

более прямой индекс

out = np.einsum('ij,li ->jli',x,M)

Out[187]:
array([[[  0,   3,  12,  27],
        [  0,  15,  36,  63],
        [  0,  27,  60,  99],
        [  0,  39,  84, 135]],

       [[  0,   4,  14,  30],
        [  4,  20,  42,  70],
        [  8,  36,  70, 110],
        [ 12,  52,  98, 150]],

       [[  0,   5,  16,  33],
        [  8,  25,  48,  77],
        [ 16,  45,  80, 121],
        [ 24,  65, 112, 165]]])
...