python - 为什么 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
),还是我的实现有问题 - 意味着有没有更快的方法来计算这些乘法?
解决方案
推荐阅读
- c - 从标准输入读取任意数量的字符,直到在 C 中按 enter
- c - 如何在uart中读取数据并同时执行一个循环?
- r - 检查字符串中的多个条件并返回二进制指示符
- julia - 在 Julia 1.0.1 中安装软件包时出现解析器错误
- php - 使用php在数组中查找每个父母的最深的孩子
- winforms - 在 PropertyGrid 中显示未更改属性的占位符文本
- julia - 如何在 Julia 中读取记录格式 json?
- android - 未连接适配器;当我尝试从 Firebase 数据库中获取图像时跳过布局
- laravel - 如何使用 Laravel Passport 驱动程序保护登录用户?
- html - 使用 XSLT 填充垂直列数据