优化numpy矩阵运算(当前使用for循环)

伊恩·罗伯茨

我已经编写了一些代码来基于列表中的n个项目计算n个矩阵,然后最后将所有矩阵相乘。

代码相对较慢,我想了解有关python优化的更多信息。我使用了性能分析工具,并确定程序中的速度下降是此矩阵乘法循环。

我想知道是否有人建议我如何加快此速度,也许可以利用Python / NumPy中基于C的内置函数的优势?

def my_matrix(x):

    # Initialise overall matrix as an identity matrix
    # | M_11 M_12 |
    # | M_21 M_22 |
    M = np.matrix([[1, 0],[0, 1]])

    for z in z_all:
        param1 = func1(z)
        param2 = func2(x, z)
        param3 = func3(x, z)

        M_11 = param1 + param2
        M_12 = param1 - param2
        M_21 = param1 * param2
        M_22 = param1 / param2

        # Multiply matrix with overall master matrix
        M = M * np.matrix([[M_11, M_12],[M_21, M_22]])
    return M

从一些背景知识来看,函数调用似乎在计算上是昂贵的,因此,比起每次在循环中评估函数,为我的参数计算数组然后访问数组可能更有效。

 param1s = funcs(z_all)
 param2s = funcs(x, z_all)
 etc

然后在for循环中:

for i, z in enumerate(z_all):
    param1 = params1[i]
    param2 = params2[i]
 etc.

这更快,但仅节省了约10%,因为通过循环中使用param1 = params1 [i]进行的数组访问所花费的时间会抵消从较少的函数调用中节省的时间。

请问有人有建议吗?

ali_m

您可以M_11, ... M_22通过做M_11s = params1 + params2来向量化您的计算

这样,您只需要在循环中执行矩阵乘法:

import numpy as np

...

# compute your 'params' over vectors of z-values
param1s = func1(z_all)
param2s = func2(x, z_all)
param3s = func3(x, z_all)  # you don't seem to be using this for anything...

# compute 'M_11, ... M_22'
M_11 = param1s + param2s
M_12 = param1s - param2s
M_21 = param1s * param2s
M_22 = param1s / param2s

# we construct a (2, 2, nz) array from these
M_all = np.array([[M_11, M_12], [M_21, M_22]])

# roll the 'nz' axis to the front so that its shape is (nz, 2, 2)
M_all = np.rollaxis(M_all, -1, 0)

# initialize output with the identity
M_out = np.eye(2)

# loop over each (2, 2) subarray in 'M_all', update the output with the
# corresponding dot product
for mm in M_all:
    M_out = M_out.dot(mm)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

优化numpy矩阵运算(当前使用for循环)

来自分类Dev

循环矩阵运算的优化

来自分类Dev

在Python / Numpy中优化许多矩阵运算

来自分类Dev

用于矩阵运算的循环

来自分类Dev

避免使用numpy矩阵进行for循环

来自分类Dev

如何使用numpy向量化矩阵中几行的运算

来自分类Dev

使用 Numpy 进行矩阵运算的更简单方法

来自分类Dev

无循环的矩阵运算MATLAB

来自分类Dev

Python Numpy 矩阵运算 - 矩阵 [a==b]?

来自分类Dev

如何使用numpy在数组上优化此双循环?

来自分类Dev

使用矩阵作为字典值并在python中执行numpy矩阵运算

来自分类Dev

与Numpy相比,优化Cython循环

来自分类Dev

numpy 优化方式(删除循环)

来自分类Dev

使用矩阵乘法的Scipy优化

来自分类Dev

优化python / numpy中的矩阵写入

来自分类Dev

是否优化了numpy矩阵链乘法?

来自分类Dev

优化python / numpy中的矩阵写入

来自分类Dev

在多维NumPy矩阵上优化迭代

来自分类Dev

循环遍历 numpy 矩阵元素

来自分类Dev

Matlab-用矩阵运算代替循环

来自分类Dev

如何在python中优化对矩阵的数学运算

来自分类Dev

如何对Numpy矩阵进行逐元素运算?

来自分类Dev

在不使用for循环的情况下使用numpy优化python函数

来自分类Dev

使用指针进行循环优化

来自分类Dev

我需要使用numpy的向量化来优化我的double for循环

来自分类Dev

除了使用循环展开之外,还有没有其他方法可以优化向量矩阵乘法?

来自分类Dev

使用javascript(或jquery)优化建筑矩阵

来自分类Dev

使用NaN优化矩阵以使行数最少

来自分类Dev

优化嵌套循环以在R中的矩阵上进行计算