for循环外向vstack追加数据构建星场数据立方体的问题咨询
核心错误原因
- 传参错误:循环遍历图像时,你调用
fitPSF传入的是固定的image_array变量,而非当前循环到的图像i,这直接导致返回的恒星参数数组长度和初始结果不一致,是你看到维度不匹配报错的核心诱因。 - 拼接逻辑完全错误:
- 循环中你每次执行
data_cube = np.vstack((results_array,new_results)),是直接用初始的results_array和当前新结果覆盖原有的data_cube,之前循环的结果全部丢失,根本没有实现追加效果 np.append是非原地操作,你没有把它的返回值赋值给data_cube,这行代码完全不生效vstack是沿0轴拼接二维数组的方法,不可能生成你需要的三维数据立方体
- 循环中你每次执行
numpy.append完全不适合这个场景:它默认会把输入数组扁平化后再拼接,极难控制三维维度,且循环中反复拼接会不断重新申请内存,效率非常低。
修复方案
推荐提前初始化固定大小的三维数组,直接按帧位置写入结果,完全避免拼接带来的维度问题,性能也最优。
首先明确你数据立方体的维度定义:我们这里按[参数数量, 恒星数量, 帧数]的维度设计,你可以根据自己的使用习惯调整维度顺序。
修正后代码示例
import numpy as np import imageio # 你原有处理第一张图像、调用fitPSF获取初始结果的逻辑保持不变 # results_array 中每个元素是长度为N的数组,对应N颗恒星的对应参数 results_array = [x2, y2, amplitude, intensity, sigma_y_fitted, sigma_x_fitted] param_num = len(results_array) # 参数总数,固定为6 star_num = len(results_array[0]) # 识别到的恒星总数,从第一张结果获取 total_frame = 6 # 第一张+后续5张,共6帧 # 提前初始化三维数据立方体 data_cube = np.zeros((param_num, star_num, total_frame)) # 写入第一帧结果 data_cube[..., 0] = np.array(results_array) # 加载后续5张图像 images = [imageio.imread(f"/home/jryan/{i+1}capture.PNG", as_gray=True) for i in range(5)] # 遍历后续图像,从索引1开始写入 for frame_idx, current_img in enumerate(images, start=1): # 复用第一张图的恒星坐标 x, y = results_array[0], results_array[1] # 传入当前帧图像调用fitPSF,替换原有的image_array x2, y2, amplitude, intensity, sigma_y_fitted, sigma_x_fitted = fitPSF(current_img, global_mean, x, y) new_results = [x2, y2, amplitude, intensity, sigma_y_fitted, sigma_x_fitted] # 直接写入对应帧位置,无需拼接 data_cube[..., frame_idx] = np.array(new_results)
内容的提问来源于stack exchange,提问作者Jimbles
相关产品推荐
相关产品推荐

