Цикл For не выполняется для каждого значения в массиве, содержащем несколько массивов

Я очень новичок в кодировании и пытаюсь написать программу обработки данных. Часть этой программы требует, чтобы я распаковал несколько файлов данных, каждый из которых содержит несколько столбцов, и сохранил все эти столбцы в массиве. Затем цикл 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)


person vesbe1998    schedule 04.04.2019    source источник
comment
возможно недоразумение: data_array1[1] — это строка индекса 1 (индексы начинаются с 0) данных, загруженных из hst_gal1_cepheids.dat. data_array1[ : , 0 ] будет массивом первого элемента из каждой строки.   -  person John M I Davis    schedule 05.04.2019


Ответы (3)


Лучше собирать значения в список, а в конце делать одно построение массива. Попробуй это:

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
person hpaulj    schedule 04.04.2019

Функция numpy.append, которую вы вызываете в своих циклах for, не изменяет свой первый аргумент на месте (в отличие от list.append). Он возвращает новый массив с выполненной конкатенацией.

Ваш код цикла сохраняет вывод как absV_newasbI_new во втором цикле), но эта переменная перезаписывается каждый раз, когда цикл повторяется. Таким образом, вы увидите только результат добавления последней строки данных к всегда пустому начальному списку.

Мне не совсем понятно, чего вы ожидаете. Возможно, вы хотите придерживаться обычных списков Python и использовать absV.append(abs_M_V)? Или, может быть, вам следует правильно определить размеры ваших переменных AlphaX и BetaX и просто использовать пустую трансляцию по всему массиву данных, а не использовать цикл Python (например, что-то, связанное с AlphaV * logP_days + BetaV)?

person Blckknght    schedule 04.04.2019
comment
Все, что я хочу, это чтобы цикл for выполнялся для каждого значения в массиве logP_days и сохранял все эти новые значения в списке. В настоящее время, когда я пытаюсь напечатать absV_new, он возвращает: Out[9]: array([-4.30240635, 271.09034583, 261.90167015], который, как я предполагаю, является только новыми значениями для первых 3 значений в исходном массиве. - person vesbe1998; 05.04.2019
comment
Этот вывод является последним результатом цикла. Он перезаписал предыдущие (точно так же, как все, кроме первого, перезаписали предыдущий). Если вы не возражаете против списка, примите мое первое предложение в моем ответе и замените absV_new = np.append(absV, abs_M_V) на absV.append(abs_M_V). Результаты будут в списке absV. Мое другое предложение также может работать, в зависимости от того, что содержат ваши переменные AlphaV и Beta (и, возможно, размеры других массивов). - person Blckknght; 05.04.2019

Я предполагаю, что если вместо этого вы попробуете:

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.

person John M I Davis    schedule 04.04.2019