You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:25:01