如何在Python中无for循环实现求和(Σ)及G''方程计算?
Python中无for循环实现G''方程的最简方法
问题描述
需要在Python中不使用for循环实现G''方程的计算,当前已通过嵌套for循环完成实现,希望得到更简洁的无循环方案。
原实现代码
import numpy as np import numpy as np import pandas as pd import math import scipy.optimize as spo from matplotlib.backend_bases import key_press_handler import matplotlib.pyplot as plt from matplotlib.figure import Figure N_Prony = 2 w = [10, 20, 30, 50, 60] g = [0.1, 0.1, 0.1] tau = [0.5, 0.5, 0.5] G0 = 10 list2=[] for J in range(len(w)): for i in range(N_Prony): GPrime_2 = G0*((g[i]*((tau[i]))*w[J])/(1+((tau[i]**2))*w[J]**2)*N_Prony) list2.append(GPrime_2)
无循环优化方案
先指出原代码的几个问题:
- 重复导入了
numpy库 N_Prony=2但g、tau长度为3,循环仅取前2个元素,逻辑存在不一致- 嵌套循环中每次迭代会覆盖
GPrime_2,最终仅保留每个w[J]对应的最后一个i的计算结果,不符合G''方程通常的累加逻辑
利用numpy的向量化运算可完全替代for循环,实现高效简洁的计算:
import numpy as np N_Prony = 2 w = np.array([10, 20, 30, 50, 60]) # 取前N_Prony个g和tau元素,与原循环逻辑对齐 g = np.array([0.1, 0.1])[:N_Prony] tau = np.array([0.5, 0.5])[:N_Prony] G0 = 10 # 利用numpy广播机制完成多维度运算 numerator = g * tau * w[:, np.newaxis] denominator = 1 + (tau * w[:, np.newaxis])**2 # 对每个w对应的所有Prony项求和,再完成最终计算 G_double_prime = G0 * np.sum(numerator / denominator, axis=1) * N_Prony print(G_double_prime)
核心说明
- 将所有输入转为numpy数组,借助广播特性自动匹配维度,无需手动编写循环
w[:, np.newaxis]将一维的w转为列向量,与一维的g、tau运算时,会自动扩展为(5,2)的矩阵,对应每个w值与每个Prony项的组合计算np.sum(..., axis=1)完成每个w对应的Prony项累加,符合G''方程的数学逻辑- 代码简洁度、运算效率远高于for循环,数据量越大优势越明显
内容的提问来源于stack exchange,提问作者Mhmoud Khadija
相关产品推荐
相关产品推荐

