首页 > 解决方案 > 有没有办法将 mxn 矩阵(1)与 pxn 矩阵(2)批量相乘,其中矩阵(2)的每一行都是标量?

问题描述

我有一个权重矩阵(权重)如下

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

我有另一个矩阵(每天)如下:

在此处输入图像描述

基本上,我写的代码如下:

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

我正在尝试对这个操作进行矢量化,而不必循环数千次。我已经有一个随机权重表(数据框),每一行代表上面代码中的权重数组。上面的代码有效,但需要相当长的时间来处理。有没有办法使用矩阵数学来解决这个问题?我看过 np.einsum 但我不明白。

任何帮助将不胜感激。

标签: pythonnumpyvectorizationlinear-algebramatrix-multiplication

解决方案


我不确定我的问题是否正确,但如果您想将第一个矩阵乘以然后对每一列求和[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) 

就是这样,希望我能回答你的问题。


推荐阅读