2014-07-08 60 views
1

我将提供下面的完整代码,但问题基本上是这样的:我创建了一个像这样的数据结构:means = {ID1:{ HOUR1:[AVERAGE_FLOW,NUMBER_OF_SAMPLES] ...}numpy.float64对象是不可迭代的...但我不想

我使用np.mean()创建了AVERAGE_FLOW。我可以这样做:

print means['716353'][0][0] #OUT : 76.6818181818 

但是当我运行第二个代码时,我想:

means[row['ID']][i][0] 

我得到:类型错误:“numpy.float64”对象不是可迭代

这里是代码,第一个是我生成平均数据的位置,第二个是我尝试创建列表的地方:

shunned=[] 
means={} #{ #DAY: [mean, number of samples]} 
hour={} 
for i in range(24): 
    hour[i]=[]  
for station in stations: 
    means[station]=copy.deepcopy(hour) 

for station in d: 
    for hour in range(24): 
     temp=[] 
     for day in range(1,31): 
      if day in sb: #swtich between sa for all days and sb for business days 
       try: #no entry = no counting in the mean, list index out of range, the station has not hourly data to begin with 
        e = d[station][str(day)][hour][0] 

        if not e: # sometimes we have '' for flow which, should not be  counted 
         next 
        else: 
         temp.append(int(e)) 
       except IndexError: 
        if station not in shunned: 
         shunned.append([station,d[station]]) 
        else: 
         next 
     temp=np.array(temp) 
     means[station][hour]=[np.mean(temp),len(temp)] 

pprint.pprint(means) 
print means['716353'][0][0] #OUT : 76.6818181818 






headers=['ID' , 'Lat', 'Lng', 'Link ID']+range(24) 

csv_list=[] 
meta_f.seek(0) 
i=0 
for row in meta_read: 
    if i>100: 
     break 
    temp=[] 
    if row['ID'] in stations: 
     temp.append([row['ID'],row['Latitude'],row['Longitude'],' ']) 
     for i in range(24): 
      temp.extend(means[row['ID']][i][0]) 
    csv_list.append(temp) 
    i+=1 

pprint.pprint(csv_list) #OUT:temp.extend(means[row['ID']][i][0]) TypeError: 'numpy.float64' object is not iterable 

我在第一个代码中尝试了str(np.means(temp)),可能是因为numpy,但它实际上给了我价值的第一位!就好像它是通过字符串ITERATING一样......你能解释一下发生了什么吗?谢谢!

回答

7

它看起来像你试图扩展一个标量浮点变量的列表。扩展参数必须是可迭代的(即不是浮点数)。从代码的第一位,它看起来像means[i][j][k]返回一个浮点数,

print means['716353'][0][0] #OUT : 76.6818181818 

的问题是在这里,

temp.extend(means[row['ID']][i][0]) 

如果用户希望means[i][j][k]将永远是一个值,而不是一个列表,你可以使用append而不是extend。

temp.append(means[row['ID']][i][0]) 

一个例子以示区别,

l = [i for i in range(10)] 
l.extend(99.0) 
TypeError: 'float' object is not iterable 

这不起作用B/CA浮动不是迭代

l.extend([99.0]) 
print l 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 99.0] 

这个工程B/CA列表迭代(甚至一个元素列表)

l.append(101.0) 
print l 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 99.0, 101.0] 

append可以处理不可迭代(例如,浮动)