我有一个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数组。任何有关追加或循环问题的帮助?谢谢。
答案 0 :(得分:1)
使用np.unique
和np.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个网站,那可能就不值得了。