代码之家  ›  专栏  ›  技术社区  ›  babbageclunk

把一个numpy recarray转换成一个2d数组?

  •  3
  • babbageclunk  · 技术社区  · 14 年前

    我们有一组针对个别日期的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
    

    我们希望生成一个数组,其中包含每个值的平均值(就好像您将每天的所有数据都放在彼此之上,并平均排列的所有值)。时间戳时间都匹配,因此我们可以通过创建一个带有时间戳的result 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)
    

    似乎一个更好的方法是将每天的数据转换成一个二维数组(去掉时间戳),然后在一次操作中对所有元素进行平均,但是我们找不到一种方法来实现这一点——它总是一个一维的对象数组。

    有人知道怎么做吗?

    1 回复  |  直到 11 年前
        1
  •  8
  •   Joe Kington    11 年前

    有几种方法可以做到这一点。一种方法是选择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 对于这样的操作,您可以轻松地使用异构数据。