【问题标题】:Averaging Parts of An Array In Python在 Python 中平均数组的各个部分
【发布时间】:2014-02-12 19:13:14
【问题描述】:

第一次来,希望我做对了。

我有一组 1960-2013 年的每日温度,我使用 np.genfromtxt 从 .txt 文件中读取。我想获取数据的年度平均值(即 1960 年的平均值,1961 年的平均值...... 2012 年的平均值,2013 年的平均值)并且不知道如何只取我需要的数组子集的平均值。我的年份也与我的温度数据大小相同。

关于如何进行此操作的任何最佳实践?

这是我目前所拥有的。它只是读取了我所有的数据。

import numpy as np
import pandas as pd

city = ['Lubbock.txt','Erie.txt']

for x in range(0,len(city),1):

   data = np.genfromtxt(city[x], usecols=(6), dtype=('S8'))
   data2 = np.genfromtxt(city[x], usecols=(7,8,9))

   dates  = pd.DatetimeIndex(data[:])
   year   = dates.year
   month  = dates.month
   day    = dates.day
   precip = data2[:,0]/10.
   tmax   = data2[:,1]/10.
   tmin   = data2[:,2]/10.

【问题讨论】:

  • 你能告诉我们你到目前为止的代码吗?
  • 你可以在python中使用array[start:end]获取数组的一部分
  • 刚刚更新它以向您展示我到目前为止所拥有的。
  • 我会看看使用 numpypandas 来做到这一点。它们非常适合/用于处理此类数据和计算方法。
  • 按照 Ewan 的说法,pandas 有一个 DataFrame,您可以从中执行 groupby 来聚合数据,在本例中为年份,然后应用平均聚合 (pandas.pydata.org/pandas-docs/dev/groupby.html#aggregation)。或者没有熊猫,您可以获得一组独特的年份来循环并使用 numpy.mean(numpy.where(data2[:,] == ))。

标签: python arrays numpy average


【解决方案1】:

很高兴看到您在使用 Pandas。它使工作变得非常容易。您可以使用pd.read_table 将数据读入DataFrame,并使用groupby 计算平均值。

具体来说,假设您的数据文件如下所示:

Lubbock.txt:

foo bar baz quux corge grault date precip tmax tmin
0 0 0 0 0 0 2012-1-1 10 20 30
0 0 0 0 0 0 2012-1-2 11 21 31
0 0 0 0 0 0 2012-1-3 12 22 32
0 0 0 0 0 0 2013-1-1 13 23 33
0 0 0 0 0 0 2013-1-2 14 24 34

然后使用 Pandas,

import numpy as np
import pandas as pd

city = ['Lubbock.txt','Erie.txt']

for filename in city:
    data = pd.read_table(filename, sep='\s+', usecols=(6,7,8,9), parse_dates=[0])
    data[['precip', 'tmax', 'tmin']] /= 10.0

    years = pd.DatetimeIndex(data['date']).year
    avg = data.groupby(years)['precip', 'tmax', 'tmin'].mean()
    print(avg)

产量

      precip  tmax  tmin
2012    1.10  2.10  3.10
2013    1.35  2.35  3.35

编辑:使用@chthonicdaemon 的建议,您可以更简单:

for filename in city:
    data = pd.read_table(filename, sep='\s+', usecols=(6,7,8,9), parse_dates=[0],
                         index_col=[0])
    data[['precip', 'tmax', 'tmin']] /= 10.0
    avg = data.resample('A', how='mean')

【讨论】:

  • 其实你不需要groupby——你可以用.resample('A', how='mean')
  • 我今天刚刚在 pandas 中发现了这个功能,但到目前为止我对这个包还不太熟悉。我敢肯定,这也会有很大帮助。谢谢!
  • @chthonicdaemon:谢谢;那就更好了。
【解决方案2】:

由于您的数据似乎已排序,您应该可以使用np.where(),它会为您提供满足某些条件的数组索引。例如,

years = range(1960,2014)
tmax_avg, tmin_avg, precip_avg = ([],[],[])

for yr in years:
    toavg = np.where(year == yr)
    tmax_avg.append(np.average(tmax[toavg])
    tmin_avg.append(np.average(tmax[toavg])
    precip_avg.append(np.average(tmax[toavg])

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 2017-06-30
    • 1970-01-01
    • 2017-04-24
    • 2015-07-31
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多