python - 根据条件执行矩阵乘积的最佳方法
问题描述
我正在使用:x = pd.DataFrame(np.random.randint(0,10,size=(20, N)))
和。N>5000
y = 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。
解决方案
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. ])