【问题标题】:Storing multiple arrays in Python在 Python 中存储多个数组
【发布时间】:2010-09-08 17:56:53
【问题描述】:

我正在编写一个程序来模拟 Gallup 或 Rasmussen 等公司每天发布的实际投票数据:www.gallup.com 和 www.rassmussenreports.com

我使用的是蛮力法,计算机会生成一些随机的每日投票数据,然后计算三天的平均值,以查看随机数据的平均值是否与投票者的数字相匹配。 (大多数公司的民意调查数字是三天的平均值)

目前,它适用于一次迭代,但我的目标是让它生成与平均轮询数据匹配的最常见的模拟。然后,我可以更改从 1 到 1000 次迭代的任何代码。

这是我的问题。在测试结束时,我在单个变量中有一个数组,看起来像这样:

[40.1, 39.4, 56.7, 60.0, 20.0 ..... 19.0]

程序当前为每个正确的模拟生成一个数组。 我可以将每个数组存储在一个变量中,但是我必须有一个程序可以根据我请求的迭代次数生成 1 到 1000 个变量!?

如何避免这种情况?我知道有一种智能方法可以做到这一点,它不需要程序根据我想要的模拟次数生成变量来存储数组。

麦凯恩的代码测试:

 test = [] 

while x < 5: 

   test = round(100*random.random())

   mctest.append(test) 

   x = x +1 


mctestavg = (mctest[0] + mctest[1] + mctest[2])/3 

#mcavg is real data

if mctestavg == mcavg[2]: 
  mcwork = mctest 

如何在不创建多个 mcwork 变量的情况下重复?

【问题讨论】:

    标签: python arrays


    【解决方案1】:

    一种巧妙的方法是将列表与 Pandas 结合使用。然后您就可以创建一个 3 天的滚动平均值。 这使得搜索结果变得很容易,只需将真实的结果添加为另一列,并使用 loc 函数查找匹配的结果。

    rand_vals = [randint(0, 100) for i in range(5))]
    df = pd.DataFrame(data=rand_vals, columns=['generated data'])
    df['3 day avg'] = df['generated data'].rolling(3).mean()
    df['mcavg'] = mcavg # the list of real data
    # Extract the resulting list of values
    res = df.loc[df['3 day avg'] == df['mcavg']]['3 day avg'].values
    

    如果您打算对不同的民意调查/人员使用相同的随机值,这也很简洁,只需添加另一列及其真实值并对它们执行相同的搜索。

    【讨论】:

      【解决方案2】:

      这样的东西有用吗?

      from random import randint    
      
      mcworks = []
      
      for n in xrange(NUM_ITERATIONS):
          mctest = [randint(0, 100) for i in xrange(5)]
          if sum(mctest[:3])/3 == mcavg[2]:
              mcworks.append(mctest) # mcavg is real data
      

      最后,您会得到一个有效的mctest 列表。

      我改变了什么:

      • 使用 list comprehension 而非 for 循环构建数据
      • 使用random.randint 获取随机整数
      • 使用slicessum计算前三项的平均值
      • (回答您的实际问题:-))将结果放入列表mcworks,而不是为每次迭代创建一个新变量

      【讨论】:

        【解决方案3】:

        我强烈考虑使用NumPy 来执行此操作。您可以获得高效的 N 维数组,您可以快速轻松地处理这些数组。

        【讨论】:

          【解决方案4】:

          由于您正在考虑变量,因此您可能更喜欢字典而不是列表:

          data = {}
          data['a'] = [generate_poll_data()]
          data['b'] = [generate_poll_data()]
          

          等等

          【讨论】:

          • 考虑变量?我还能想到什么?一些背景。我知道一点 PASCAL,并且正在使用它作为学习 Python 的项目。
          • 我更喜欢列表的字典而不是列表的列表。
          【解决方案5】:

          python 中的列表可以包含任何类型的对象——如果我正确理解了这个问题,lists 中的 list 会完成这项工作吗?像这样的东西(假设你有一个函数 generate_poll_data() 来创建你的数据:

          data = []
          
          for in xrange(num_iterations):
              data.append(generate_poll_data())
          

          然后,data[n] 将是来自(n-1)th 运行的数据列表。

          【讨论】:

          • s/nth/(n+1)th/ 运行。运行从 1 开始计数(第一次运行、第二次运行等)。
          【解决方案6】:

          你是说要这样做吗?

          >>> a = [ ['a', 'b'], ['c', 'd'] ]
          >>> a[1]
          ['c', 'd']
          >>> a[1][1]
          'd'
          

          【讨论】:

            猜你喜欢
            • 2016-02-13
            • 1970-01-01
            • 1970-01-01
            • 2012-02-09
            • 1970-01-01
            • 1970-01-01
            • 2017-11-10
            • 2019-07-29
            • 2021-08-10
            相关资源
            最近更新 更多