#python #numpy #python-3.7
#python #numpy #python-3.7
Вопрос:
Я очень новичок в кодировании и пытаюсь написать программу обработки данных. Часть этой программы требует, чтобы я распаковал несколько файлов данных, каждый из которых содержит несколько столбцов, и сохранил все эти столбцы в массиве. Затем цикл ‘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)
Комментарии:
1. вероятно, недоразумение: data_array1[1] — это строка индекса 1 (индексы начинаются с 0) данных, загруженных из «hst_gal1_cepheids.dat». data_array1[ : , 0 ] будет массивом первого элемента из каждой строки.
Ответ №1:
Лучше собирать значения в список и в конце создавать один массив. Попробуйте это:
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
Ответ №2:
numpy.append
Функция, которую вы вызываете в своих for
циклах, не изменяет свой первый аргумент на месте (в отличие от list.append
). Он возвращает новый массив с выполненной конкатенацией.
Ваш код цикла сохраняет выходные данные как absV_new
(и asbI_new
во втором цикле), но эта переменная перезаписывается каждый раз, когда цикл повторяется. Таким образом, вы увидите результат добавления последней строки данных к всегда пустому исходному списку.
Мне не совсем понятно, чего вы ожидаете. Возможно, вы хотите придерживаться обычных списков Python и использовать absV.append(abs_M_V)
? Или, может быть, вам следует правильно определить размеры ваших AlphaX
и BetaX
переменных и просто использовать numpy-трансляцию по всему массиву данных, а не использовать цикл Python (например, что-то связанное с AlphaV * logP_days BetaV
)?
Комментарии:
1. Все, что я хочу, это чтобы цикл ‘for’ выполнялся для каждого значения в массиве logP_days и сохранял все эти новые значения в списке. В настоящее время, когда я пытаюсь напечатать absV_new , он возвращает: Out[9]: array([ -4.30240635, 271.09034583, 261.90167015], который, как я предполагаю, является только новыми значениями для первых 3 значений в исходном массиве.
2. Этот вывод является последним результатом цикла. Он перезаписал предыдущие (точно так же, как все, кроме первого, перезаписали предыдущий). Если вы не возражаете против списка, примите мое первое предложение в моем ответе и замените
absV_new = np.append(absV, abs_M_V)
наabsV.append(abs_M_V)
. Результаты будут вabsV
списке. Мое другое предложение также может сработать, в зависимости от того, что содержат ваши переменныеAlphaV
иBeta
(и, возможно, размеры других массивов).
Ответ №3:
Я предполагаю, что если вы вместо этого попытаетесь:
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.