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

下面列出的代码是尝试获得具有另一个部分列和的矩阵,使得结果矩阵的行是从到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 S

M= 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 L

L = 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)


红糖糍粑
浏览 75回答 1
1回答

浮云间

使用 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 倍。生成代码:import perfplotimport numpy as npdef 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 Lperfplot.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)',    )
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python