首页 > 解决方案 > 根据条件执行矩阵乘积的最佳方法

问题描述

我正在使用:x = pd.DataFrame(np.random.randint(0,10,size=(20, N)))和。N>5000y = np.random.dirichlet(np.ones(20),size=1)

我在每x列和y(这是一个总和为 1 的权重列表)之间执行矩阵乘积,最终得到一个N元素数组,所以我使用x.T.dot(y).

现在,我想修改我的矩阵乘积计算:对于计算的 X 的当前列上的每个 0,我们y通过不考虑将乘以 0 的权重来重新加权,并将其平均分布在将是的权重之间乘以不同于 0 的值,因此列表的总和仍为 1。

具有较小结构的示例

x

       a1   a2   a3
b1     1    5    6
b2     3    0    0
b3     9    7    0

y = [0.3, 0.5, 0.2]

预期输出:[3.6, 5.9, 6]

第 1 步:无零 -> 简单加权平均(0.3*1+0.5*3+0.2*9 = 3.6)

第 2 步:(b2,a2) = 0所以y变成[0.55, 0, 0.45]0.55*5+0.45*7 = 5.9

第 3 步:(b2,a3) & (b3,a3) = 0如此,y总数[1, 0, 0]为 6。

特殊性:数据框的结构是建立的,例如当有一个0时,同一行的以下单元格将等于0。

标签: pythonpython-3.xpandasnumpy

解决方案


A您可以构建一个与stacking形状相同的新矩阵,y使用掩码对其进行调整,然后在列上执行元素乘法和求和:

y= np.array([0.3, 0.5, 0.2])
A = np.array([[1, 5, 6],
       [3, 0, 0],
       [9, 7, 0]])
m = A == 0
new_y = np.repeat(y,A.shape[1]).reshape(A.shape)
new_y = (new_y + (new_y*m).sum(axis=0)/(~m).sum(axis=0))*~m
result = (new_y * A).sum(axis=0)
result
>> array([3.6 5.9 6. ])

推荐阅读