问候,
我不确定这是不是一个愚蠢的问题。
假设我有 3 个 numpy 数组 A1、A2、A3 和 3 个 float 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 中做类似的事情,但我不确定它是否必要。
提前感谢您的任何见解。 -尼克
最佳答案
虽然从理论上讲,numpy
可以随时升级其内部结构以执行奇妙的优化,但目前它还没有:B = A1*c1 + A2*c2 + A3*c3
确实会生成然后丢弃中间临时数组(当然“花费”一些辅助内存——没有别的)。
B = A1 * c1
后跟 B += A2 * c2; B += A3 * c3
,同样此时,因此将避免花费一些临时内存。
当然,只有当您在实际内存稀缺的环境中运行(其中一些辅助内存只是虚拟的并导致页面错误)并且足够大的数组以“花费”所有真实内存,然后是一些。然而,在这种极端条件下,一点重构可以为您带来一些性能。
关于python - python/numpy中的线性组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2937669/