#python #python-3.x #list #arraylist #calculator
#python #python-3.x #Список #arraylist #калькулятор
Вопрос:
У меня есть следующие переменные:
data = ['10 20 10 36 30 33',
'100 50 50 30 60 27 70 24',
'300 1000 80 21 90 18 100 15 110 12 120',
'30 90 130 6 140 3']
data = [e.split() for e in data]
список массивов int64
time = [np.array((time[2::2]), dtype=int) for time in data]
concentration = [(np.array((concentration[3::2]), dtype=int)) for concentration in data]
список float64
C_mean = [np.mean(np.log(x)) for x in concentration]
T_mean = [np.mean(x) for x in time]
Я хочу сделать следующее:
Итак, вычислил это:
a = ((np.subtract(time, T_mean)),(np.subtract(concentration, C_mean)))/(np.subtract(concentration, C_mean))
Я получаю следующий вывод:
Colum 1
0 row [ -6.49123184 -7.47653761 -6.7979074 -3.07121711 670.34039133 -265.40965169]
1 row [1. 1. 1. 1. 1. 1.]
Colum 2
0 row [-4.66057051 -4.80484032 -2.53370436 13.82370265 -198.83963652]
1 row [1. 1. 1. 1. 1.]
column 3
0 row [ -3.2910719 -3.38052422 -3.42088285 -2.39247195 5.4158155 64.96324446
-455.85973604]
1 row [1. 1. 1. 1. 1. 1. 1.]
Я не знаю, почему я получаю [1. 1. 1. 1. 1. 1. 1. 1.] и я бы хотел, чтобы они не появлялись. Кроме того, я боюсь, что я неправильно рассчитал значение a.
Комментарии:
1. потому что вы забыли умножить два массива… вы просто вычитаете и делите: p
Ответ №1:
Во-первых, нет необходимости преобразовывать данные в список, numpy может делать все, что вы хотите, для нескольких столбцов. Еще одно замечание заключается в том, что вы не берете квадрат в знаменателе (в приведенном вами примере) и не умножаете числитель.
Когда вы пытаетесь решить проблемы, попробуйте начать с простейшего случая, поэтому мы начнем с одной строки данных:
data = '10 20 10 36 30 33'
data = np.array(list(map(int, data.split( ))))
time = data[2::2]
concentration = np.log(data[3::2])
Теперь мы можем отдельно вычислить числитель и знаменатель. Вы можете проверить эти ответы вручную, чтобы проверить, верны ли ответы.
numerator = np.sum((time - time.mean()) * (concentration - concentration.mean()))
denumerator = np.sum(np.square(time - time.mean()))
a = numerator / denumerator
# Output
-0.004350568849481484
Теперь вы можете поместить этот код в функцию и запустить данные над этой функцией. Гораздо проще попытаться отладить одну запись, чем все записи одновременно.
Редактировать
Вышеупомянутое решение было для одного запуска, чтобы применить один и тот же процесс ко всем запускам, которые мы можем использовать:
data = ['10 20 10 36 30 33',
'100 50 50 30 60 27 70 24',
'300 1000 80 21 90 18 100 15 110 12 120',
'30 90 130 6 140 3']
Определите функцию из приведенного выше решения:
def processing(row):
data = np.array(list(map(int, row.split( ))))
time = data[2::2]
concentration = np.log(data[3::2])
# I had to add this line, since there is a length difference on your 3th input.
if len(time) != len(concentration):
return np.NaN
numerator = np.sum((time - time.mean()) * (concentration - concentration.mean()))
denumerator = np.sum(np.square(time - time.mean()))
a = numerator / denumerator
return a
Запустите понимание списка по всем входным данным:
result = [processing(row) for row in data]
Вывод:
[-0.004350568849481484, -0.011157177565710486, nan, -0.06931471805599453]
Комментарии:
1. Это отличный ответ, но я хочу сохранить свои переменные времени и концентрации, как описано в вопросе
2. Поэтому я хочу сохранить их как список массива
3. Это решение для одной записи в этих списках, поэтому, если вы хотите сгенерировать решения для всех записей, вы можете запустить его с помощью цикла for . Это было то, что я имел в виду в своей последней строке, поместите ее в функцию и запустите код, используя для понимания цикла / списка над этой функцией.
4. Я новичок в этом, не могли бы вы мне показать? Я пытался запустить код в цикле вне функции, но это не дало мне желаемого результата, пожалуйста, помогите мне
5. Я обновляю решение, но, основываясь на вашей формуле, ожидаемый результат должен быть одним числом для каждой записи данных, поскольку вы суммируете числитель и знаменатель.