【问题标题】:linear combinations in python/numpypython / numpy中的线性组合
【发布时间】:2011-02-25 15:08:40
【问题描述】:

你好,

我不确定这是不是一个愚蠢的问题。

假设我有 3 个 numpy 数组 A1、A2、A3 和 3 个浮点数 c1、c2、c3

我想评估 B = A1*c1+ A2*c2+ A3*c3

将 numpy 计算为例如,

 E1 = A1*c1
 E2 = A2*c2
 E3 = A3*c3
 D1 = E1+E2
 B = D1+E3

还是比这更聪明?在 c++ 中,我有一种巧妙的方法来抽象这种操作。

我定义了一系列通用的“LC”模板函数,LC 用于线性组合,例如:

template<class T,class D>
void LC( T & R,
    T & L0,D C0,
    T & L1,D C1,
    T & L2,D C2)
{
    R = L0*C0
        +L1*C1
        +L2*C2;        
}

然后将其专门用于各种类型,

例如,对于一个数组,代码看起来像

for (int i=0; i<L0.length; i++)
    R.array[i] =
    L0.array[i]*C0 +
    L1.array[i]*C1 +
    L2.array[i]*C2;

从而避免创建新的中间数组。

这可能看起来很乱,但效果很好。

我可以在 python 中做类似的事情,但我不确定它是否需要。

提前感谢您提供任何见解。 -尼克

【问题讨论】:

    标签: python arrays numpy linear-algebra


    【解决方案1】:

    虽然numpy 理论上可以随时升级其内部以执行奇妙的优化,但目前它不能:B = A1*c1 + A2*c2 + A3*c3 确实会产生然后丢弃中间临时数组(“花费”一些辅助记忆,当然——没有别的)。

    B = A1 * c1 后跟B += A2 * c2; B += A3 * c3,再次此时,因此将避免花费一些临时内存。

    当然,只有在实际内存稀缺的环境(其中一些辅助内存只是虚拟的并导致页面错误)和足够大的数组以“花费”所有真实内存,然后是一些。然而,在如此极端的条件下,一点重构可以为你带来一些性能。

    【讨论】:

      【解决方案2】:

      这就是numexpr(Python 和 NumPy 的快速数值数组表达式求值器)背后的理念。在编译你自己的例程之前,你可以试试这个包。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-17
        • 2012-11-18
        • 2013-10-10
        • 2015-05-19
        • 2021-11-20
        • 1970-01-01
        相关资源
        最近更新 更多