Python中如何将循环结果转为数组?代码问题求助
问题分析与解决方法
嘿,我一眼就看到你代码里的问题啦!你在循环里每次都把LOL重新赋值成[f(L[i])]——这意味着每一轮循环都会创建一个只包含当前单个元素的新列表,之前的元素全被覆盖掉了!所以最后LOL里只会剩下最后一次循环计算出来的那个值,自然没法通过LOL[1]获取前面的元素,变量管理器里也看不到完整的数组。
快速修复:正确构建列表
你需要先初始化一个空列表,然后在循环里把每个计算出来的元素追加进去,而不是每次都重新定义列表:
import numpy as np L = np.linspace(0, 105, 100) Iy = 5 def f(x): if x < 5.25: I = 5*Iy*(x/105) return I elif 5.25 < x < 36.75: I = (0.25*Iy) + (15*Iy/(6*105))*(x-5.25) return I elif 36.75 < x < 78.75: I = Iy return I elif 78.75 < x < 99.75: I = Iy -2.5*(Iy/105)*(x-78.75) return I elif 99.75 < x: I = 0.5*Iy - (10*Iy/105)*(x-99.75) return I # 初始化空列表 LOL = [] for i in range(0, 100): # 追加元素到列表中 LOL.append(f(L[i])) print(LOL) # 现在你可以用LOL[1]获取第二个元素啦
更高效的优化:利用Numpy向量化特性
既然你已经在用Numpy了,完全没必要用Python循环来逐个计算——Numpy的向量化操作会快很多,而且直接得到Numpy数组,索引访问更方便。这里可以用np.piecewise来处理分段函数:
import numpy as np L = np.linspace(0, 105, 100) Iy = 5 # 用np.piecewise定义分段函数 LOL = np.piecewise(L, [ L < 5.25, (L > 5.25) & (L < 36.75), (L > 36.75) & (L < 78.75), (L > 78.75) & (L < 99.75), L > 99.75 ], [ lambda x: 5*Iy*(x/105), lambda x: (0.25*Iy) + (15*Iy/(6*105))*(x-5.25), lambda x: Iy, lambda x: Iy -2.5*(Iy/105)*(x-78.75), lambda x: 0.5*Iy - (10*Iy/105)*(x-99.75) ] ) # 现在LOL是Numpy数组,直接用索引访问 print(LOL[1])
这样处理后,LOL就是一个标准的Numpy数组,不仅能直接用索引访问元素,在变量管理器里也能清晰看到完整的数组结构。
内容的提问来源于stack exchange,提问作者fordprefect
相关产品推荐
相关产品推荐

