2010-08-11 60 views
3

我们已经为单独的日子准备了一组数据 - 第一个属性是时间戳,其余是值。将numpy recarray(的一部分)转换为2d数组?

其中的几项:

ts    a b c 
2010-08-06 08:00, 1.2, 3.4, 5.6 
2010-08-06 08:05, 1.2, 3.4, 5.6 
2010-08-06 08:10, 1.2, 3.4, 5.6 
2010-08-06 08:15, 2.2, 3.3, 5.6 
2010-08-06 08:20, 1.2, 3.4, 5.6 

我们想生产的每个值的平均值的数组(因为如果你打下都在彼此的顶部当天的数据,以及所有平均排列的值)。时间戳时间全都匹配,所以我们可以通过创建一个带有时间戳结果recarray做到这一点,和其他列全部为0,然后做这样的事情:

for day in day_data: 
    result.a += day.a 
    result.b += day.b 
    result.c += day.c 

result.a /= len(day_data) 
result.b /= len(day_data) 
result.c /= len(day_data) 

这似乎是一个更好的办法是转换每天用一个数字去除数字(砍掉时间戳),然后在一个操作中对它们进行全部元素平均,但是我们无法找到一种方法来做到这一点 - 它总是一个1d的对象数组。

有谁知道如何做到这一点?

回答

8

有几种方法可以做到这一点。一种方法是选择recarray的多个列,并且施展他们的花车,然后重塑回一个二维数组:

new_data = data[['a','b','c']].astype(np.float).reshape((data.size, 3)) 

或者,你可能会考虑这样的事情(可忽略的速度较慢,但​​更易读):

new_data = np.vstack([data[item] for item in ['a','b','c']]).T 

另请注意,查看pandas进行这些操作可能是个好主意,这样您就可以轻松处理异构数据。

+2

太好了,谢谢!作为一个整体,我仍然努力习惯于对数组进行处理 - 我的直觉是单独对元素进行处理。从我的测试中发现一个注意事项 - 虽然.view(np.float)部分没有制作副本,但花式切片确实如此。 – babbageclunk 2010-08-12 10:02:06

+1

@Joe:如果我没有弄错,@wilberforce对于副本是正确的:'data [['a','b','c']] .base'为None,所以这意味着它拥有它的数据并不从'data'继承它。这是有道理的,因为这些字段通常不是连续的。如果您确认这一点,最好更新您的答案。 :) – EOL 2013-07-29 09:32:02

+0

@EOL - 你是对的! (我不知道我当时在想什么......) – 2013-07-30 01:49:08