Python中是否有任何简单的方法/命令来进行两个(或三个)矩阵乘法以获得乘积核,例如扩展网格?我的意思是应该对每个网格组合评估点。
我有两种解决方案,但是第一种是使用循环(在我的情况下是不可接受的),另一种是在乘法运算之前对输入进行重塑(硬编码,适用于2个内核的乘积,如果要用于3,4,则需要进行调整) ,等等)。
第一个解决方案:
for xi, xg in enumerate(xgrid):
for yi, yg in enumerate(ygrid):
kde[xi, yi] = 1 / ndata * np.sum(kernel1(xg) * kernel2(yg))
其中kernel1(xg)* kernel2(yg)是矢量,例如(1,10000),其中在每个网格点xg和yg评估数据点。因此,我们实际上是逐步构建网格计算产品。
第二种解决方案,其中“ fullkernel”已经是评估网格上数据的对象:
kde = np.zeros(shape=(98, 98)) # 98 is length of grid
X_out = np.repeat(fullkernel[0], len(fullkernel[0]), axis=0)
Y_out = np.tile(fullkernel[1], (len(fullkernel[1]), 1))
testing = 1 / len(fullkernel[0]) * np.sum(X_out * Y_out, axis=1)
f = np.reshape(testing.T, kde.shape)
完整内核的形状为(2,98,9999),其中2是两个不同的数据集,即98个网格点和9999个数据点。
所以最后,我需要一个大小为(9604,9999)的矩阵,该矩阵类似于上面的示例中的X_out * Y_out,但是没有重塑和平铺初始数据。是否有办法仅使用fullkernel [0]和fullkernel [1]通过某些命令获得此矩阵?
答案 0 :(得分:0)
我通过反复试验找到了解决方案。如果对其他人有帮助:
res = 1 / len(fullkernel[0][0]) * np.sum(fullkernel[0][:, None, :] * fullkernel[1], axis=2)
乘法运算的结果是多维数据集98 * 98 * 9999。再创建一个维度是使乘法“像网格一样”的关键,例如固定一个网格点xg并遍历y的所有其他网格点,然后对x的其他网格点再次重复。
在对各列求和后,res的形状为98 * 98,这正是我需要的。运行2个10000点的数据集和len = 98上的2个网格花了0.7秒。 For循环花了2.7秒。 平铺/重复接近1.6秒。