Как вычесть список из списка массива?

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