如何在for循环中添加np.arrays() ?



这个应用是在分析天体物理数据,但问题纯粹是一个编程/语法问题。我想遍历我的53个bin的数据(每一个1D星系光谱在星系的不同半径),并执行一些算法来确定运动学参数,如每个bin/半径的旋转速度和速度色散。有人能告诉我我在for循环中做错了什么,我想在半径数组中获得53个值,但只有2个(大概是第一个和最后一个)。我想我会从第一个值radius_center开始,然后使用np.append()将在每次循环迭代中将半径的下一个值附加到数组中,所以我最终会在数组中得到53个值。

for bin in (1, 53):
gal_data = np.loadtxt('C:/Users/bins/'+str(bin)+'_upper.txt')
loglam_gal = gal_data[0, :]
flux_gal = gal_data[1, :]
gh_moments = fcq_application(loglam_temp, flux_temp, loglam_gal, flux_gal)[0]
z = fcq_application(loglam_temp, flux_temp, loglam_gal, flux_gal)[1]
radius = gal_data[2, 2]
radius_arr = np.append(radius_center, radius)

编辑:以下@Jérôme Richard我用列表做了所有的事情,我用for循环之前的起始值初始化了列表。问题是现在我有3个值在我的列表中通过循环运行后,而不是53,我不知道为什么…下面是代码:

for bin in (1, 53):
gal_data = np.loadtxt('C:/Users/reich/OneDrive/Dokumente/Uni/Bachelorarbeit/Python/bins/'+str(bin)+'_upper.txt')
loglam_gal = gal_data[0, :]
flux_gal = gal_data[1, :]
gh_moments, z, *_ = fcq_application(loglam_temp, flux_temp, loglam_gal, flux_gal)
radius = gal_data[2, 2]
radius_list.append(radius)
vel_rot = np.abs(vel_rot_center-gh_moments[0])
vel_rot_list.append(vel_rot)
vel_disp = gh_moments[1]
vel_disp_list.append(vel_disp)
h3 = gh_moments[2]
h3_list.append(h3)
h4 = gh_moments[3]
h4_list.append(h4)
z_list.append(z)
signal_to_noise = gal_data[3, 3]
signal_to_noise_list.append(signal_to_noise)

for bin in (1,53):将把(1,53)视为只包含1和53的元素元组,要实际通过for bin in range(1,54)(54而不是53,因为它不包括最后一个元素)的范围。

radius_arr = np.empty(53) # pre-allocate a numpy array of length 53
# btw if you wanted radius_center to be the first value, you'd want to do
# radius_arr = np.empty(54)
# radius_arr[0] = radius_center
# then in the for loop use radius_arr[i] = radius instead of radius_arr[i-1]
for i in range(1,54):
gal_data = np.loadtxt('C:/Users/bins/'+str(bin)+'_upper.txt')
loglam_gal = gal_data[0, :]
flux_gal = gal_data[1, :]
gh_moments = fcq_application(loglam_temp, flux_temp, loglam_gal, flux_gal)[0]
z = fcq_application(loglam_temp, flux_temp, loglam_gal, flux_gal)[1]
radius = gal_data[2, 2]
radius_arr[i-1] = radius

对于一般知识,如果你想使用追加,你可以使用类似这样的东西:

radius_arr = np.array([radius_center]) # this is very inefficient
radius_list = [radius_center] # this is better
for i in range(1,54):
...
radius_arr = radius_arr.append(radius) # this is very inefficient
radius_list.append(radius) # doing it with a list first and appending the values is better
radius_list = np.array(radius_list) # can convert a list to a numpy array

python tuple

最新更新