Python中如何传递数组至函数,将局部数组存入全局数组并循环处理长数组?
长数组循环处理与结果存储的实现方案
我编写了一个可接收两个数组并生成另外两个数组的函数,希望多次执行该函数,每次取输入数组中的下一组两个元素进行处理——例如输入数组包含10个值时,需循环执行5次。目前函数仅能在短测试数组X=[0,1]、Y=[0,2]下正常运行,无法遍历更长的数组。目标是让函数支持任意长度的输入数组,每次循环选取数组中的下两个元素,同时将函数生成的局部数组存入全局数组中。
原代码:
import pandas as pd from cmath import cos from xml.etree.ElementTree import PI import matplotlib.pyplot as plt import math import numpy as np import csv import pandas as pd df=pd.read_csv("Geas_csv.csv") #array1=list(df["x"].values) #array2=list(df["y"].values) radius = .1 X = [] Y = [] X_10 = [] X = [0,1] Y = [0,2] def generate_shape(X,Y): gradient=(Y[1]-Y[0])/(X[1]-X[0]) print (gradient) normal=-(1/gradient) print (normal) new_x_coord = [0,0,0,0,0] new_y_coord = [0,0,0,0,0] print (math.atan(normal)) print (radius*math.cos(math.atan(normal))) print (radius*math.sin(math.atan(normal))) new_x_coord[0] = X[0]+radius*math.cos(math.atan(normal)) new_x_coord[1] = X[0]-radius*math.cos(math.atan(normal)) new_x_coord[2] = X[1]-radius*math.cos(math.atan(normal)) new_x_coord[3] = X[1]+radius*math.cos(math.atan(normal)) new_x_coord[4] = new_x_coord[0] print (new_x_coord) new_y_coord[0] = Y[0]+radius*math.sin(math.atan(normal)) new_y_coord[1] = Y[0]-radius*math.sin(math.atan(normal)) new_y_coord[2] = Y[1]-radius*math.sin(math.atan(normal)) new_y_coord[3] = Y[1]+radius*math.sin(math.atan(normal)) new_y_coord[4] = new_y_coord[0] print (new_y_coord) plt.plot(new_x_coord, new_y_coord) plt.plot(X,Y) plt.grid() plt.show() return (new_x_coord, new_y_coord) generate_shape(X,Y)
修改后的实现方案
下面是调整后的代码,解决了长数组遍历和结果存储的问题,同时修复了垂直直线时的计算报错:
import pandas as pd import matplotlib.pyplot as plt import math # 读取数据(如果需要从CSV读取,取消注释下面两行) # df = pd.read_csv("Geas_csv.csv") # X, Y = list(df["x"].values), list(df["y"].values) # 测试用长数组示例 radius = .1 X = [0, 1, 3, 5, 7] Y = [0, 2, 4, 6, 8] # 全局数组,用于存储所有生成的结果 all_new_x = [] all_new_y = [] def generate_shape(x1, y1, x2, y2): # 处理垂直直线的情况,避免除以0 if x2 - x1 == 0: # 垂直直线的法向量是水平方向 cos_theta = 1.0 sin_theta = 0.0 else: gradient = (y2 - y1)/(x2 - x1) normal = -(1/gradient) theta = math.atan(normal) cos_theta = math.cos(theta) sin_theta = math.sin(theta) new_x_coord = [ x1 + radius * cos_theta, x1 - radius * cos_theta, x2 - radius * cos_theta, x2 + radius * cos_theta, x1 + radius * cos_theta # 闭合图形 ] new_y_coord = [ y1 + radius * sin_theta, y1 - radius * sin_theta, y2 - radius * sin_theta, y2 + radius * sin_theta, y1 + radius * sin_theta # 闭合图形 ] # 绘制当前图形 plt.plot(new_x_coord, new_y_coord) plt.plot([x1, x2], [y1, y2]) plt.grid() return new_x_coord, new_y_coord # 遍历数组的连续点对 for i in range(len(X) - 1): x1, x2 = X[i], X[i+1] y1, y2 = Y[i], Y[i+1] nx, ny = generate_shape(x1, y1, x2, y2) # 将结果存入全局数组 all_new_x.append(nx) all_new_y.append(ny) # 展示所有绘制的图形 plt.show() # 打印存储的所有结果 print("所有生成的X坐标数组:", all_new_x) print("所有生成的Y坐标数组:", all_new_y)
关键改动说明
- 函数参数调整:将原函数接收整个数组改为接收单个点对(
x1,y1,x2,y2),适配循环处理的需求 - 循环遍历逻辑:用
range(len(X)-1)遍历所有连续点对,确保每次取数组的下两个元素 - 全局结果存储:新增
all_new_x和all_new_y数组,每次调用函数后将结果追加进去 - 异常处理:新增垂直直线的判断,避免
x2-x1=0时的除以0错误 - 代码简化:用列表推导式重构坐标生成代码,更简洁易读
内容的提问来源于stack exchange,提问作者Josh Gorham
相关产品推荐
相关产品推荐

