使用For循环在二维数组上进行计算

时间:2014-03-07 16:02:07

标签: python arrays for-loop numpy

我有一个9X51100二维数组(9个不同的数据集,51,100个每日文件),我试图获取140个年平均数据并将它们附加到一个新数组。但是,numpy.append需要两个参数,我最终会追加超出我想要的数量,我相信。这是我得到的代码和错误。

import numpy as np

citydata = ['bcm2.a2.USC00101022.tmax.1960.2099.txt','bcm2.a2.USC00362682.tmax.1960.2099.txt','bcm2.a2.USC00415411.tmax.1960.2099.txt',
    'ccsm.a2.USC00101022.tmax.1960.2099.txt','ccsm.a2.USC00362682.tmax.1960.2099.txt','ccsm.a2.USC00415411.tmax.1960.2099.txt',
    'pcm.a2.USC00101022.tmax.1960.2099.txt','pcm.a2.USC00362682.tmax.1960.2099.txt','pcm.a2.USC00415411.tmax.1960.2099.txt']

year = np.asanyarray([(np.genfromtxt(item, skip_header=1)[:,0]) for item in citydata])
tmax = np.asanyarray([(np.genfromtxt(item, skip_header=1)[:,3]*(9./5.))+32 for item in citydata])

tmax_avg = np.zeros([9,140]) #initialize averaged array
for i in range(0,8,1):
    for yr in years: 
        toavg = (year == yr)
        tmax_avg[i,:] = np.append(tmax_avg,np.average(tmax[toavg]))



ValueError                                Traceback (most recent call last)
<ipython-input-23-a8a57d128124> in <module>()
  8     for yr in years:
  9         toavg = (year == yr)
 10-->      tmax_avg[i,:] = np.append(tmax_avg,np.average(tmax[toavg]))

ValueError: could not broadcast input array from shape (1261) into shape (140)

它似乎只是想给我一个140值数组而不是9X140数组。任何有关追加或循环问题的帮助?谢谢。

1 个答案:

答案 0 :(得分:1)

使用np.uniquenp.bincount对内部for循环进行矢量化是一种相对简单的方法。如果我正确阅读了您的代码,year(9, 51100)年份标签数组,tmax是相同形状的相应数组。您可以执行以下操作:

tmax_avg = []

count_years = np.unique(year).size

for loc in range(year.shape[0]):
    unq_year, unq_idx = np.unique(year[loc], return_inverse=True)
    unq_sum = np.bincount(unq_idx, weights=tmax[loc], minlength=count_years)
    unq_count = np.bincount(unq_idx, minlength=count_years)
    tmax_avg.append(unq_sum / unq_count)
tmax_avg  = np.vstack(tmax_avg)

你可以摆脱loc循环,但如果你有9个网站,那可能就不值得了。