2011-08-16 64 views
3

如果给定一个相同(用户指定)对象的数组结构,那么有没有办法一次引用所有对象?如何访问numpy数组结构中的对象属性

E.g.给定一个类型为date的对象的数组结构,是否有一种方法可以取得多年的平均值,而无需使用for循环或对数组中每个对象的年份属性进行+1 +1?

示例代码如下。

from numpy import * 
from datetime import * 

#this works 
A = array([2012, 2011, 2009]) 
print average(A) 

date1 = date(2012,06,30) 
date2 = date(2011,06,30) 
date3 = date(2010,06,30) 
B = array([date1, date2, date3]) 
print B[0].year 
print B[1].year 
print B[2].year 

#this doesn't 
print average(B.year) 

回答

1

认为你可以做到这一点通过以下方式:

from numpy import array, average 
from datetime import date 

date1 = date(2012,06,30) 
date2 = date(2011,06,30) 
date3 = date(2010,06,30) 
B = array([date1, date2, date3]) 

avYear = average([x.year for x in B]) 

市价修改意见:

B = array([x.replace(year=x.year+10) for x in B]) 

并注意从模块导入*使用不太好 - 这是总是更好地导入只有你真正需要的thoose类和函数。

+0

感谢您的快速回复!如果您也可以考虑以下事项,我将非常感激。如何从每个年份属性(2012,2011,2010)中减去10年并将新值存储在相同对象(结构B)中? –

+0

@rm检查我的补充答案是否可以帮助您 –

+0

感谢您的更新!你能否澄清一个细节?对于B中的x []的[x.replace(year = x.year + 10)]行是否创建日期对象的新副本还是操作原始对象?在进行一些测试之后,我认为它会创建一个包含原始日期对象副本的新列表。 –

0

这可以通过vectorize函数完成。从手动

import numpy as np 
from datetime import date 

date1 = date(2012,06,30) 
date2 = date(2011,06,30) 
date3 = date(2010,06,30) 
B = np.array([date1, date2, date3]) 

yr = lambda x: x.year 
vyr = np.vectorize(yr) 
print vyr(B) 
# array([2012, 2011, 2010]) 
print np.average(vyr(B)) 
# 2011.0 

注:

矢量化功能主要为了方便而提供,而不是性能。实现本质上是一个for循环。