Есть ли способ пакетного умножения матрицы mxn (1) на матрицу pxn (2), где каждая строка матрицы (2) является скаляром? - PullRequest
0 голосов
/ 01 октября 2019

У меня есть матрица (веса) весов следующим образом

A           B           C           D           E
0.416616274 0.007893688 0.074517004 0.164169555 0.336803478
0.165291635 0.205668613 0.085747923 0.278888074 0.264403755
0.308129534 0.284158392 0.292223348 0.001855199 0.113633527
0.090124092 0.404455217 0.120245226 3.84E-01    0.001496657
0.093981405 0.295247335 0.174392231 0.337238495 0.099140533
0.080119669 0.43934981  0.215148622 0.010537966 0.254843933
0.315502416 0.082623702 0.076406749 0.196668283 0.32879885

У меня есть другая матрица (ежедневно) следующим образом:

enter image description here

По сути, код, который я написал, выглядит следующим образом:

def f(x):
    if x < 0:
        return abs(x)
    else:
        return x

for i in range(10000):
    weights = np.random.random(num_assets)
    weights /= np.sum(weights)
    #multiply matrix daily by weights, sum all columns and get the min value
    dd = np.multiply(weights, daily).sum(axis=1, skipna = True).min()
    dd = f(dd)
    dd1.append(dd) #append results to empty list

Я пытаюсь векторизовать эту операцию, а не циклически повторять эту функцию тысячи раз. У меня уже есть таблица (dataframe) случайных весов, где каждая строка представляет массив весов в приведенном выше коде. Приведенный выше код работает, но обработка занимает довольно много времени. Есть ли способ использовать матричную математику, чтобы решить эту проблему? Я посмотрел на np.einsum, но не понимаю.

Любая помощь будет принята с благодарностью.

1 Ответ

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

Я не уверен, правильно ли я понял вопрос, но если вы хотите умножить первую матрицу [A] (5 x 7) на [B] (5 X m) и затем суммировать каждый столбец:

Сначала определите вашу матрицу с помощью:

weights = np.matrix(np.random.rand(5,7))
daily = np.matrix([ ])

затем убедитесь, что форма каждой матрицы умножена на них (количество столбцов левой матрицы должно быть равно количеству строк правой матрицы). В этом случае нам нужно транспонировать матрицу Rigth (ежедневно):

daily = np.transpose(daily)

, используя np.dot(), умножив две матрицы:

matrix_result = np.dot(weights, daily) 

и, наконец, для суммирования каждого столбца умножьте matrix_resultс вертикальным вектором единиц

v_ones = np.ones(( ))
sums_results = np.dot(matrix_result, v_ones) 

и на этом все, надеюсь, я отвечу на ваш вопрос.

...