将numpy recarray(部分)转换为2d数组?

bab*_*unk 3 python numpy recarray

我们为个别日期提供了一组数据重组 - 第一个属性是时间戳,其余属性是值.

其中几个:

    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
Run Code Online (Sandbox Code Playgroud)

我们想要生成每个值的平均值数组(就好像您将所有日期数据放在彼此之上,并平均排列的所有值).所有匹配的时间戳都是时间,所以我们可以通过创建带有时间戳的结果重新排列,其他列全部为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)
Run Code Online (Sandbox Code Playgroud)

似乎更好的方法是将每天转换为只有数字的2d数组(减去时间戳),然后在一次操作中将它们全部按元素进行平均,但是我们找不到这样做的方法 - 它始终是一个对象数组.

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

Joe*_*ton 8

有几种方法可以做到这一点.一种方法是选择重新排列的多个列并将它们转换为浮点数,然后重新形状化为2D数组:

new_data = data[['a','b','c']].astype(np.float).reshape((data.size, 3))
Run Code Online (Sandbox Code Playgroud)

或者,您可能会考虑这样的事情(可忽略的慢,但更具可读性):

new_data = np.vstack([data[item] for item in ['a','b','c']]).T
Run Code Online (Sandbox Code Playgroud)

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

  • 那很好,谢谢!我仍然在努力习惯于在阵列上做一些事情 - 我的本能就是单独为元素做事.我的测试中有一个注意事项 - 虽然.view(np.float)部分没有复制,但是花哨的切片确实如此. (2认同)