Python嵌套循环报错:无法计算不同步数分布的均方位移
问题分析与解决
核心报错原因
报错ValueError: could not broadcast input array from shape (0,) into shape (1000,)的直接原因是:
step_variation = np.linspace(0, 10000, 11)生成的第一个元素是0,当n=0时,int(step_variation[n])=0,rand(0)会生成空数组,经过cumsum后仍然是shape(0,)的空数组。- 而
x_step[:,m]是初始化时固定的shape(1000,)数组,空数组无法赋值给长度为1000的数组,导致广播失败。
除此之外,代码还有两个关键问题:
x_step和y_step的形状固定为(1000, 1000),但step_variation中包含大于1000的步数(比如10000),生成的累积位移数组长度会超过1000,同样会触发形状不匹配错误。- 计算均方位移时,
np.mean(displacement[m,0]**2)只取了最后一次步行的位移平方,而不是所有1000次步行的均值,结果完全错误。
修正后的代码
import numpy as np # 初始化变量 rng = np.random.default_rng() rand = rng.random num_walks = 1000 mean_squared_displacement = np.zeros(10) # 调整步数范围:去掉0,从1000到10000生成10个均匀分布的步数 step_variation = np.linspace(1000, 10000, 10) for n in range(len(step_variation)): current_steps = int(step_variation[n]) # 直接生成所有步行的最终x、y位移,无需保存每一步位置 x_final = np.cumsum(2*(rand((num_walks, current_steps)) < 0.5) - 1, axis=1)[:, -1] y_final = np.cumsum(2*(rand((num_walks, current_steps)) < 0.5) - 1, axis=1)[:, -1] # 计算均方位移:直接用平方均值,无需先算平方根再平方 mean_squared_displacement[n] = np.mean(x_final**2 + y_final**2) print(mean_squared_displacement)
关键修改点说明
- 移除步数0:将
step_variation调整为从1000开始,避免生成空数组。 - 优化内存与形状匹配:不再保存每一步的位置,直接计算所有步行的最终位移,通过
axis=1对每一行(单个步行)做累积和,最后取[:, -1]得到最终位置,避免固定形状导致的不匹配问题。 - 修正均方位移计算:直接计算所有步行的
x_final² + y_final²的均值,跳过多余的平方根计算(因为均方位移是位移平方的均值,不需要先开根号再平方),同时确保取所有步行的均值,而非单个步行的值。
内容的提问来源于stack exchange,提问作者Buff_physics
相关产品推荐
相关产品推荐

