python - python/numpy中的线性组合

标签 python arrays numpy linear-algebra

问候,

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

假设我有 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/

相关文章:

Python 线程挂起

python - 如何使用 `cv2.perspectiveTransform` 在 Python OpenCV 中的一组点上应用单应性?

javascript - 一个数组还是多个? (哈希表)

java - 打印数组列表中的特定部分

java - 我正在编写一个程序来比较两个数组,但我无法让它将数组与空元素进行比较

python - 将列表的 numpy 数组展平为每行 4 个值

python - sphinxcontrib.napoleon 和 numpy.numpydoc 之间的区别

python - docopt 位置参数不起作用

python - 替换索引数组下方的 numpy 二维数组元素

python - 从 git 安装时,我可以强制 pip 进行浅表检查吗?