首页 > 解决方案 > 为什么 numpy.multipy() 在这种具有非常大的多维数组的特定情况下如此昂贵?

问题描述

使用 EM 算法,我目前正在摆弄以下代码示例(这是在一个循环中,所以我只是零):

    XminusMu = np.subtract(X, mu[i])
    matmul = np.matmul(XminusMu[:,:,np.newaxis],  XminusMu[:,np.newaxis,:])
    nominator = np.multiply(alpha[i], matmul)

数组具有以下形状:

XminusMu.shape = (1512090, 25)
matmul.shape = (1512090, 25, 25)
alpha.shape = (2,)

奇怪的是,即使这些是巨大的数组,在此之前我对它们进行了很多操作,没有问题并且运行时间非常快(尽可能避免循环)。同样在上述情况下,减法和 matmul 操作相当快(matmul 操作需要 3-5 秒,但我想这对于 CPU 上的 150 万个外部产品来说仍然是合理的?)。但是,计算nominator最多需要 30 秒,任务管理器显示,python 最多使用 5GB 内存。如果我在计算提名者之后设置断点,我什至无法在 Visual Studio 监视窗口中真正评估它,因为评估中断/没有完成。在运行这条线之前(例如运行np.sum(XminusMu)在 VS 监视窗口中调试期间需要一瞬间,但np.sum(nominator)会导致评估错误。

现在,问题是:这只是不可避免的(因为matmul并且nominator仍然比 大 25 倍XminusMu),还是我的实现有问题 - 意味着有没有更快的方法来计算这些乘法?

标签: pythonarraysnumpy

解决方案


推荐阅读