从 for 循环附加到 vstack

appending to a vstack out of a for loop

我有多个星空图像,可以从中提取信息。我想创建一个数据立方体,前两个维度是像素坐标和信息,第三个维度是后续图像。第一个图像是第一个切片,以此类推。

我使用的函数查看图像,确定星星的位置,记下其坐标和强度信息,并将其放入数组中。我希望我的程序在后续图像中使用与第一张图像相同的坐标,重新计算强度信息,并为每个循环将这些新结果附加到数据立方体,每次都添加一个新切片。

这是我写的:

#above imports the first image, and applies function fitPSF to it, which returns:
results_array = [x2, y2, amplitude, intensity, sigma_y_fitted, sigma_x_fitted]

#want first image to be first slice in data cube
data_cube = np.vstack((results_array,))

#load image captures
images = [imageio.imread("/home/jryan/"+str(i + 1)+'capture.PNG', as_gray=True) for i in range(5)]

#loop through 5 frames
for i in images:        
#define coordinates to fit a psf to 
    x,y = results_array[0],results_array[1]
    #fitpsf
    x2, y2, amplitude, intensity, sigma_y_fitted, sigma_x_fitted = fitPSF(image_array, global_mean, x, y)
    new_results = [x2, y2, amplitude, intensity, sigma_y_fitted, sigma_x_fitted]
    
    #append new results to data cube
    data_cube = np.vstack((results_array,new_results))
    np.append(data_cube,new_results)

我现在遇到的错误是

ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 149 and the array at index 1 has size 147,

而且我无法确定原因。现在我使用了 6 次完全相同的图像,所以尺寸应该是兼容的。

我还相信,当每个 new_results 被附加到 data_cube 时,它不会被解释为数据立方体中的新切片,而只是被附加到 2D结果数组。是否附加了正确的模块来尝试执行此操作?还是我使用的流程有误?

如果参数中的 axis 没有明确提供,一些 numpy 函数会做一些意想不到的事情,即使它在大多数情况下没有它也能做你通常想要的事情。使用 np.append 它会 two things you may not want it to:

  1. 如果您不指定轴参数,它会展平输入!
  2. 它每次都会创建一个新的数组副本。

第一遍后,data_cube是一维数组。


对我来说,我喜欢将每个“行”累积到一个列表中,然后调用 np.stack 一次并提供我希望在您的情况下成为时间维度的轴。这是我最好的猜测:

#above imports the first image, and applies function fitPSF to it, which returns:
results_array = [x2, y2, amplitude, intensity, sigma_y_fitted, sigma_x_fitted]

#want first image to be first slice in data cube
results_arrays = [np.array(results_array)]

#load image captures
images = [imageio.imread("/home/jryan/"+str(i + 1)+'capture.PNG', as_gray=True) for i in range(5)]

#loop through 5 frames
x,y = results_array[0],results_array[1] #results_array was never modified so these x,y should remain the same throughout the loop
for i in images:        
    #fitpsf
    new_results = fitPSF(image_array, global_mean, x, y)
    results_arrays.append(np.array(new_results)) # this is a list append, not np.append

data_cube = np.stack(results_arrays, axis=-1) # assuming you want the last axis to be time

---
# or in one line:

x, y = results_array[:2]
data_cube = np.stack([np.array(results_array)]+ list(map(lambda img: np.array(fitPSF(img, global_mean, x, y)),  images)), axis=-1)