python / numpy中的线性组合

时间:2010-05-30 05:33:08

标签: python arrays numpy linear-algebra

问候,

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

假设我有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中做类似的事情,但我不确定它是否是必须的。

提前感谢任何见解。 -nick

2 个答案:

答案 0 :(得分:6)

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

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

当然,只有当你在一个实际内存稀少的环境中运行时(其中一些辅助内存只是虚拟的并导致页面错误)并且对于足够大的数组来说,你才能区分它们。 “花”所有真正的记忆,然后一些。然而,在这种极端条件下,一点点重构可以为你带来一些性能。

答案 1 :(得分:2)

这是numexpr(Python和NumPy的快速数值数组表达式求值程序)背后的想法。在编译自己的例程之前,您可以尝试使用此包。