'for'循环不对包含多个数组的数组中的每个值执行

问题描述 投票:0回答:3

我是编码和尝试编写数据处理程序的新手。该程序的一部分要求我解压缩多个数据文件,每个文件有多个列,并将所有这些列存储在一个数组中。然后,'for'循环应对每个值执行基本计算。我不确定为什么它不起作用。它似乎只评估第一个数组中每个值的循环。

data_array1 = np.loadtxt("hst_gal1_cepheids.dat", dtype = "float", usecols = (1,2,3))
data_array2 = np.loadtxt("hst_gal2_cepheids.dat", dtype = "float", usecols = (1,2,3))
data_array3 = np.loadtxt("hst_gal3_cepheids.dat", dtype = "float", usecols = (1,2,3))
data_array4 = np.loadtxt("hst_gal4_cepheids.dat", dtype = "float", usecols = (1,2,3))
data_array5 = np.loadtxt("hst_gal5_cepheids.dat", dtype = "float", usecols = (1,2,3))
data_array6 = np.loadtxt("hst_gal6_cepheids.dat", dtype = "float", usecols = (1,2,3))
data_array7 = np.loadtxt("hst_gal7_cepheids.dat", dtype = "float", usecols = (1,2,3))
data_array8 = np.loadtxt("hst_gal8_cepheids.dat", dtype = "float", usecols = (1,2,3))

logP_days = np.array([data_array1[1], data_array2[1], data_array3[1], data_array4[1], data_array5[1] , data_array6[1] , data_array7[1], data_array8[1]])

m_V1 = np.array([data_array1[2], data_array2[2], data_array3[2], data_array4[2], data_array5[2] , data_array6[2] , data_array7[2], data_array8[2]])

m_I1 = np.array([data_array1[3], data_array2[3], data_array3[3], data_array4[3], data_array5[3] , data_array6[3] , data_array7[3], data_array8[3]])

data_array9 = np.loadtxt("galaxy_data.dat", dtype= "float", usecols = (1,2))
recessional_velocity = data_array9[1]
V_band_extinction = data_array9[2]

absV = []
absI = []

for i in logP_days:
        abs_M_V = AlphaV*i + BetaV
        absV_new = np.append(absV, abs_M_V)

for i in logP_days:
        abs_M_I = AlphaI*i + BetaI
        absI_new = np.append(absI, abs_M_I)

python numpy python-3.7
3个回答
0
投票

最好在列表中收集值,并在最后执行一个数组构造。试试这个:

absV = []
for i in logP_days:
        abs_M_V = AlphaV*i + BetaV
        absV.append(abs_M_V)
absV_new = np.array(absV)

列表追加更快,更容易正确。

通常有一些方法可以在不进行迭代的情况下构造数组。只需快速浏览一下该循环即可:

AlphaV*np.arange(logP_days) + BetaV

0
投票

你在numpy.append循环中调用的for函数不会修改它的第一个参数(与list.append不同)。它返回一个连接完成的新数组。

你的循环代码将输出保存为absV_new(和第二个循环中的asbI_new),但每次循环重复时该变量都会被覆盖。因此,您只会看到最后一行数据的结果已附加到始终为空的初始列表。

我不太清楚你期望发生什么。也许你想坚持使用常规的Python列表并使用absV.append(abs_M_V)?或者你应该正确地找出你的AlphaXBetaX变量的维度,并且只是在整个数据数组中使用numpy广播,而不是使用Python循环(例如与AlphaV * logP_days + BetaV相关的东西)?


0
投票

我想如果你改为尝试:

ogP_days = np.array([data_array1[:,0], data_array2[:,0], data_array3[:,0], data_array4[:,0], data_array5[:,0] , data_array6[:,0] , data_array7[:,0], data_array8[:,0]])

m_V1 = np.array([data_array1[:,1], data_array2[:,1], data_array3[:,1], data_array4[:,1], data_array5[:,1] , data_array6[:,1] , data_array7[:,1], data_array8[:,1]])


m_I1 = np.array([data_array1[:,1], data_array2[:,1], data_array3[:,1], data_array4[:,1], data_array5[:,1] , data_array6[:,1] , data_array7[:,1], data_array8[:,1]])

并将usecols =(1,2,3)更改为usecols =(0,1,2)您将获得更好的结果。

我正在做两件事。切片数组[:,0]为您提供每行的第一个元素。索引也从0开始。

© www.soinside.com 2019 - 2024. All rights reserved.