如何减少多变量方程的代码行数?
How to reduce the lines of code with multi variable equations?
我正在尝试减少代码行数,因为我意识到我每次都在重复相同的方程式。我正在编写一个等高线图并将几个强度源放入其中。到现在我放了3个源,但以后我想放更多,那会增加很多行数。所以我想看看是否可以减少“源位置”和“强度方程”的行。如您所见,最后一个等式是 z1、z2 和 z3 的对数求和,是否可以减少它,知道吗?
import numpy as np
import matplotlib.pyplot as plt
def run():
# mesh
N = 100
x = np.linspace(-N, N)
y = np.linspace(-N, N)
X,Y = np.meshgrid(x,y)
# sources coordinates
p1 = [-5,-1]
p2 = [6 , 0]
p3 = [-10 , -8]
# sources postions
R1 = np.sqrt((((p1[0]-X)**2)+((p1[1]-Y)**2)))
R2 = np.sqrt((((p2[0]-X)**2)+((p2[1]-Y)**2)))
R3 = np.sqrt((((p3[0]-X)**2)+((p3[1]-Y)**2)))
# # Intensity Equation
z1 = np.round(10 * np.log10((((((R1/(1000**(1/3)))**-1.45) * 516)/(20**(-3)))**2)),0)
z2 = np.round(10 * np.log10((((((R2/(1000**(1/3)))**-1.45) * 516)/(20**(-3)))**2)),0)
z3 = np.round(10 * np.log10((((((R3/(4000**(1/3)))**-1.45) * 516)/(20**(-3)))**2)),0)
z_total = 10*np.log10((10**(z1/10))+(10**(z2/10)+(10**(z3/10))))
# # Ploting
Z = np.array(z_total).reshape(len(y),len(x))
cs = plt.contourf(X,Y,Z,10)
plt.colorbar()
plt.show()
if __name__ =='__main__':
run()
您可以在循环中迭代某些部分。
我试图在整体上保持相同的格式,只是重新安排了代码以展示您可以如何做。
import numpy as np
import matplotlib.pyplot as plt
def run():
# mesh
N = 100
x = np.linspace(-N, N)
y = np.linspace(-N, N)
X,Y = np.meshgrid(x,y)
# sources coordinates
p = [
[-5,-1],
[6 , 0],
[-10 , -8],
]
# sources postions + intensity Equation
z_log = 0
for px, py in p:
r = np.sqrt((((px-X)**2)+((py-Y)**2)))
z = np.round(10 * np.log10((((((r/(1000**(1/3)))**-1.45) * 516)/(20**(-3)))**2)),0)
z_log += 10**(z/10)
z_total = 10*np.log10(z_log)
# # Ploting
Z = np.array(z_total).reshape(len(y),len(x))
cs = plt.contourf(X,Y,Z,10)
plt.colorbar()
plt.show()
if __name__ =='__main__':
run()
我的一个建议是展开运算符(x + y * 2
优于 x+y*2
),为变量提供描述性名称(例如 coordinates
而不是 p
), 并将你的计算分成更多的部分。例如,z
中有太多括号,如果某些地方无法正常工作,我不想尝试调试。
尝试在 run()
方法之外制作更小、更紧凑的函数。将它们清楚地命名为它们所做的和完成的事情(有助于提高可读性)这是一个如何使这个小功能更清晰的示例。
import numpy as np
import matplotlib.pyplot as plt
# declare 'mesh' outside of run to get from other functions
N = 100
x = np.linspace(-N, N)
y = np.linspace(-N, N)
X,Y = np.meshgrid(x,y)
def run():
# sources postions
R1 = getSourcePosition([-5,-1])
R2 = getSourcePosition([6 , 0])
R3 = getSourcePosition([-10 , -8])
...
def getSourcePosition(p1):
# X,Y available from above declaration
return np.sqrt((((p1[0]-X)**2)+((p1[1]-Y)**2)))
if __name__ =='__main__':
run()
如果这是一个更大的函数,带有 类、程序包和更多移动部件,我不会推荐全局变量,但看起来您只是想 运行 看起来像简单的脚本
我正在尝试减少代码行数,因为我意识到我每次都在重复相同的方程式。我正在编写一个等高线图并将几个强度源放入其中。到现在我放了3个源,但以后我想放更多,那会增加很多行数。所以我想看看是否可以减少“源位置”和“强度方程”的行。如您所见,最后一个等式是 z1、z2 和 z3 的对数求和,是否可以减少它,知道吗?
import numpy as np
import matplotlib.pyplot as plt
def run():
# mesh
N = 100
x = np.linspace(-N, N)
y = np.linspace(-N, N)
X,Y = np.meshgrid(x,y)
# sources coordinates
p1 = [-5,-1]
p2 = [6 , 0]
p3 = [-10 , -8]
# sources postions
R1 = np.sqrt((((p1[0]-X)**2)+((p1[1]-Y)**2)))
R2 = np.sqrt((((p2[0]-X)**2)+((p2[1]-Y)**2)))
R3 = np.sqrt((((p3[0]-X)**2)+((p3[1]-Y)**2)))
# # Intensity Equation
z1 = np.round(10 * np.log10((((((R1/(1000**(1/3)))**-1.45) * 516)/(20**(-3)))**2)),0)
z2 = np.round(10 * np.log10((((((R2/(1000**(1/3)))**-1.45) * 516)/(20**(-3)))**2)),0)
z3 = np.round(10 * np.log10((((((R3/(4000**(1/3)))**-1.45) * 516)/(20**(-3)))**2)),0)
z_total = 10*np.log10((10**(z1/10))+(10**(z2/10)+(10**(z3/10))))
# # Ploting
Z = np.array(z_total).reshape(len(y),len(x))
cs = plt.contourf(X,Y,Z,10)
plt.colorbar()
plt.show()
if __name__ =='__main__':
run()
您可以在循环中迭代某些部分。
我试图在整体上保持相同的格式,只是重新安排了代码以展示您可以如何做。
import numpy as np
import matplotlib.pyplot as plt
def run():
# mesh
N = 100
x = np.linspace(-N, N)
y = np.linspace(-N, N)
X,Y = np.meshgrid(x,y)
# sources coordinates
p = [
[-5,-1],
[6 , 0],
[-10 , -8],
]
# sources postions + intensity Equation
z_log = 0
for px, py in p:
r = np.sqrt((((px-X)**2)+((py-Y)**2)))
z = np.round(10 * np.log10((((((r/(1000**(1/3)))**-1.45) * 516)/(20**(-3)))**2)),0)
z_log += 10**(z/10)
z_total = 10*np.log10(z_log)
# # Ploting
Z = np.array(z_total).reshape(len(y),len(x))
cs = plt.contourf(X,Y,Z,10)
plt.colorbar()
plt.show()
if __name__ =='__main__':
run()
我的一个建议是展开运算符(x + y * 2
优于 x+y*2
),为变量提供描述性名称(例如 coordinates
而不是 p
), 并将你的计算分成更多的部分。例如,z
中有太多括号,如果某些地方无法正常工作,我不想尝试调试。
尝试在 run()
方法之外制作更小、更紧凑的函数。将它们清楚地命名为它们所做的和完成的事情(有助于提高可读性)这是一个如何使这个小功能更清晰的示例。
import numpy as np
import matplotlib.pyplot as plt
# declare 'mesh' outside of run to get from other functions
N = 100
x = np.linspace(-N, N)
y = np.linspace(-N, N)
X,Y = np.meshgrid(x,y)
def run():
# sources postions
R1 = getSourcePosition([-5,-1])
R2 = getSourcePosition([6 , 0])
R3 = getSourcePosition([-10 , -8])
...
def getSourcePosition(p1):
# X,Y available from above declaration
return np.sqrt((((p1[0]-X)**2)+((p1[1]-Y)**2)))
if __name__ =='__main__':
run()
如果这是一个更大的函数,带有 类、程序包和更多移动部件,我不会推荐全局变量,但看起来您只是想 运行 看起来像简单的脚本