在执行计算时在for循环中更新变量名

时间:2019-02-12 18:17:57

标签: python python-3.x pandas numpy

每当我偶然发现使用Python进行某种计算时,我都会倾向于使用非Python方法,因为我对这种语言不太熟悉:

import pandas as pd
import numpy as np

v        = 8
gf       = 2.5

data_a1  = np.random.randint(5, 10, 21)
data_a2  = np.random.randint(5, 10, 21)
data_a3  = np.random.randint(5, 10, 21)
data_a4  = np.random.randint(5, 10, 21)
data_a5  = np.random.randint(5, 10, 21)

data_b1  = np.random.randint(6, 11, 21)
data_b2  = np.random.randint(6, 11, 21)
data_b3  = np.random.randint(6, 11, 21)
data_b4  = np.random.randint(6, 11, 21)
data_b5  = np.random.randint(6, 11, 21)

e_1 = 2 * (data_a1 + data_b1) / 2 / v / gf
e_2 = 2 * (data_a2 + data_b2) / 2 / v / gf
e_3 = 2 * (data_a3 + data_b3) / 2 / v / gf
e_4 = 2 * (data_a4 + data_b4) / 2 / v / gf
e_5 = 2 * (data_a5 + data_b5) / 2 / v / gf

从上面的示例中可以看到,我显式地将其写下了五次,而不是使用Python来想象如何打算使用它-我想通过在每次更新时计算e使用for循环进行迭代,我也更喜欢使用numpy

由于我的所有努力都没有取得成果,所以我求助于pandas,因为我非常有信心可以出于任何原因赎回自己:

df_a     = pd.DataFrame({'data_a1': data_a1, 'data_a2': data_a2, 'data_a3': data_a3, 'data_a4': data_a4, 'data_a5': data_a5})
df_b     = pd.DataFrame({'data_b1': data_b1, 'data_b2': data_b2, 'data_b3': data_b3, 'data_b4': data_b4, 'data_b5': data_b5})

c   = 0
dfs = []
for i,j in zip(df_a, df_b):
    e = 2 * (i + j) / 2 / v / gf
    e = e.add_suffix('_' + str(c))
    dfs.addpend(e)
    c += 1

A,我的愚蠢无处不在,无论哪种方式我都做不到。

  • 是否有一种简化的方法可以使用numpy处理方程式,以使变量在被认为是pythonic的for循环中更新自身?
  • 执行这些任务时,建议坚持使用numpy还是转到pandas

3 个答案:

答案 0 :(得分:3)

首先,让我们远离创建许多变量名的过程。在Python中,列表可以包含其他对象,包括数组。

datalist1 = []
for _ in range(5):
    datalist1.append(np.random.randin(5, 10, 21))
# same for datalist2
datalist2 = [np.random.randint(6, 11, 21), 
             np.random.randint(6, 11, 21),
            ...]

elist = [2*(a+b)/2/v/gf for a,b in zip(datalist1, datalist2)]

使用形状为(5,21)的2d数组效果更好。但是,我演示的列表迭代类型适用于所有Python,而不仅限于numpy

您甚至可以从预先存在的变量中列出清单:

alist = [data_b1, data_b2, ...]

答案 1 :(得分:2)

我可能会误解您的意图,但是据我所知,您并没有感到烦恼或查找任何东西,因此没有理由从numpy变成熊猫(这是一个非常好装的numpy数组) 。相反,您应该查看numpy提供的向量化操作。

再次,我不清楚您的最终目标,因为您没有提供输出,但这是否接近您的要求?

v        = 8
gf       = 2.5
a=np.random.randint(5,10,(21,5))
b=np.random.randint(5,10,(21,5))
c=2*(a+b)/2/v/gf

c

array([[0.9 , 0.75, 0.75, 0.6 , 0.65],
       [0.75, 0.65, 0.5 , 0.9 , 0.75],
       [0.7 , 0.6 , 0.75, 0.75, 0.85],
       [0.6 , 0.6 , 0.7 , 0.8 , 0.7 ],
       [0.6 , 0.75, 0.9 , 0.8 , 0.8 ],
       [0.85, 0.65, 0.65, 0.7 , 0.65],
       [0.65, 0.65, 0.65, 0.55, 0.7 ],
       [0.5 , 0.7 , 0.7 , 0.55, 0.6 ],
       [0.65, 0.6 , 0.8 , 0.9 , 0.7 ],
       [0.65, 0.7 , 0.55, 0.6 , 0.8 ],
       [0.75, 0.55, 0.75, 0.7 , 0.65],
       [0.8 , 0.7 , 0.65, 0.7 , 0.55],
       [0.55, 0.8 , 0.6 , 0.6 , 0.7 ],
       [0.8 , 0.75, 0.7 , 0.85, 0.7 ],
       [0.7 , 0.55, 0.75, 0.7 , 0.55],
       [0.6 , 0.7 , 0.7 , 0.6 , 0.65],
       [0.55, 0.8 , 0.7 , 0.6 , 0.75],
       [0.65, 0.75, 0.7 , 0.65, 0.6 ],
       [0.8 , 0.85, 0.7 , 0.8 , 0.7 ],
       [0.85, 0.8 , 0.55, 0.6 , 0.8 ],
       [0.8 , 0.8 , 0.75, 0.7 , 0.7 ]])

答案 2 :(得分:1)

因此,鉴于其他信息,该怎么办?

#simulate getting new data every day for a week
n_days   = 7

#set constants
v        = 8
gf       = 2.5
data_dict={}
#append data
for i in range(n_days+1):
    a=np.random.randint(5,10,21)
    b=np.random.randint(5,10,21)
    data_dict['dayN+'+str(i)]=2*(a+b)/2/v/gf #instead of str(i), you could append the key with datetime.now(), etc.

data_dict

{'dayN+0': array([0.275, 0.275, 0.4  , 0.3  , 0.325, 0.425, 0.4  , 0.45 , 0.3  ,
        0.375, 0.375, 0.35 , 0.425, 0.35 , 0.4  , 0.325, 0.3  , 0.3  ,
        0.35 , 0.3  , 0.375]),
 'dayN+1': array([0.3  , 0.275, 0.325, 0.375, 0.4  , 0.425, 0.325, 0.325, 0.4  ,
        0.35 , 0.3  , 0.4  , 0.375, 0.25 , 0.375, 0.375, 0.45 , 0.35 ,
        0.425, 0.35 , 0.4  ]),
 'dayN+2': array([0.4...