为了账号安全,请及时绑定邮箱和手机立即绑定

矩阵或嵌套列表的部分列和

矩阵或嵌套列表的部分列和

红糖糍粑 2022-07-26 10:40:42
下面列出的代码是尝试获得具有另一个部分列和的矩阵,使得结果矩阵的行是从到row[r]的原始矩阵的部分列和。row=0row=r例如,给定A = [[0,0,0],     [4,5,6],     [7,8,9],     [10,11,12]]我想获得B=[[0,0,0],   [4,5,6],   [11,13,15],   [21,24,27]]是否有替代方法可以让我消除以下代码中的 for 循环,并允许我使用纯列表理解来代替?如果我正在处理的实际矩阵相对较大,您是否认为列表理解会比 for 循环或 map/lambda 更高效?我当前的代码如下:import numpy as np# Define matrices M and SM= np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])H = np.array([0.1, 0.2, 0.3])# Define matrix S with: S[0] = [0,0,0,0] and S[r>0][c] = M[r][c]xH[r]S = np.array([[x if r != 0 else 0 for x in [M[r][c] * H[r] for c in range(0, len(M[r]))]] for r in range(len(M))])# initialize matrix LL = np.array(np.zeros((int(len(M)),int(len(M[0])))))#Update Matrix L: L[r][c] = Sum[S[0][c] to S[i=r-1][c]]for r in range(0, len(L)):        L[r] = [sum([row[i] for row in S[0:r+1]]) for i in range(0,len(S[0]))]print("S", S)print("L", L)
查看完整描述

1 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

使用 numpy 时,做某事的最快方法通常是使用广播或矢量化。您可以在此处阅读有关此内容的更多信息,但基本上这意味着一次将函数应用于数据数组,而不是使用 for 循环遍历数组。


这可能是您在谈论列表理解时所暗示的,但本质上这些只是编写 for 循环的不同方式。


在这种情况下,您要查找的函数是np.cumsum(),axis=0用于指示我们要对每一列进行累积求和。这是一种应用您寻求的逻辑的矢量化方法,并且比您在大型矩阵上的 for 循环解决方案要快得多。


>>> A = np.array([[0,0,0],[4,5,6],[7,8,9],[10,11,12]])

>>> np.cumsum(A, axis=0)

array([[ 0,  0,  0],

       [ 4,  5,  6],

       [11, 13, 15],

       [21, 24, 27]], dtype=int32)

下图显示了随着矩阵大小的增加,这种方法与您问题中的方法的速度比较,这表明矢量化方法的速度往往快大约 10,000 倍。

//img1.sycdn.imooc.com//62df544700010be003970263.jpg

生成代码:


import perfplot

import numpy as np


def cdjb_cumsum(A):

    return np.cumsum(A, axis=0)


def ajbg_forloop(A):

    L = np.array(np.zeros((int(len(A)),int(len(A[0])))))

    for r in range(0, len(L)):

        L[r] = [sum([row[i] for row in A[0:r+1]]) for i in range(0,len(A[0]))]

    return L


perfplot.show(

    setup=lambda n: np.random.rand(n, n),

    n_range=[2**k for k in range(20)],

    kernels=[

        cdjb_cumsum, ajbg_forloop

        ],

    xlabel='Size of Array (n*n)',

    )


查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 67 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信