Как векторизовать с несоответствующей размерностью - PullRequest
0 голосов
/ 31 октября 2019

У меня есть некоторые ограничения вида

A_{i,j,k} = r_{i,j}B_{i,j,k}

A - матрица nxmxp, как и B. r - матрица nxm.

Я хотел бы как-то векторизовать это в Python максимально эффективно. Прямо сейчас я превращаю r в nxmxp матрицу, говоря r_{i,j,k} = r_{i,j} for all 1 <= k <= p. Затем я звоню np.multiply на r и B. Это кажется неэффективным. Любые идеи приветствуются, спасибо.

def ndHadamardProduct(r, n, m, p): #r is a n x m matrix, p is an int
    rnew = np.zeros(n, m, p)
    B = np.zeros(n, m, p)
    for i in range(n):
        for j in range(m):
            for k in range(p):
                r[i, j, k] = r[i, j]
                B[i, j, k] = random.uniform(0, 1)
    return np.multiply(r, B)

1 Ответ

1 голос
/ 31 октября 2019

Добавьте дополнительное измерение с помощью np.newaxis, а затем вещание позаботится о повторении для вас.

import numpy as np
r = np.random.random((3,4))
b = np.random.random((3,4,5))
a = r[:,:,np.newaxis] * b
...