Python矩阵乘法生成网格

2024-04-27 03:56:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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)

fullkernel的形状是(2,98,9999),其中2是两个不同的数据集,98个网格点和9999个数据点。你知道吗

最后,我需要一个大小为(96049999)的矩阵,这个矩阵类似于上面例子中的X_out*Y_out,但不需要重新整形和平铺初始数据。有没有办法只使用fullkernel[0]和fullkernel[1]命令而不做任何额外的准备来获取这个矩阵?你知道吗


Tags: 数据命令网格forlen产品np矩阵
1条回答
网友
1楼 · 发布于 2024-04-27 03:56:23

我已经通过反复试验找到了解决办法。如果有助于他人:

res = 1 / len(fullkernel[0][0]) * np.sum(fullkernel[0][:, None, :] * fullkernel[1], axis=2)

相互应用的结果是立方体98*98*9999。再创建一个维度是使乘法成为“网状网格”的关键,例如固定一个网格点xg并穿过y的所有其他网格点,然后对x的其他网格点重复所有操作

在对列求和之后,res的形状是98*98,这就是我需要的。在len=98上运行2个10000点和2个网格的数据集需要0.7秒。 循环用了2.7秒。 平铺/重复进近1.6秒。你知道吗

相关问题 更多 >