2011-08-16 65 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循環。