3d numpy记录数组

时间:2012-06-27 20:04:51

标签: python numpy

是否可以在numpy中拥有3-D记录数组? (也许这是不可能的,或者只是一种更容易的方式来做事 - 我对其他选择持开放态度。)

假设我想要一个包含3个变量数据的数组(比如temp,precip,humidity),每个变量的数据实际上是2年(行)和6个月数据(列)的二维数组,I可以像这样创建:

>>> import numpy as np

>>> d = np.array(np.arange(3*2*6).reshape(3,2,6))
>>> d

#
# comments added for explanation...
#        jan   feb   mar   apr   may   Jun    

array([[[ 0,    1,    2,    3,    4,    5],   # yr1  temp
        [ 6,    7,    8,    9,   10,   11]],  # yr2  temp

       [[12,   13,   14,   15,   16,   17],   # yr1  precip
        [18,   19,   20,   21,   22,   23]],  # yr2  precip

       [[24,   25,   26,   27,   28,   29],   # yr1  humidity
        [30,   31,   32,   33,   34,   35]]]) # yr2  humidity

我希望能够输入:

>>> d['temp']

得到这个(数据的第一个“页面”):

>>> array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])

或:

>>> d['Jan']   # assume months are Jan-June

得到这个

>>> array([[0,6],
          [12,18],
          [24,30]])

我经历过这样的问题:http://www.scipy.org/RecordArrays多次,但不知道如何设置我所追求的目标。

1 个答案:

答案 0 :(得分:12)

实际上,你可以使用结构化数组做类似的事情,但它通常比它的价值更麻烦。

你想要的基本上是标记轴。

Pandas(建立在numpy之上)提供了你想要的东西,如果你想要这种类型的索引,它是一个更好的选择。还有Larry (for labeled array),但它在很大程度上被熊猫取代了。

此外,您应该查看有关结构化数组的numpy文档,而不是常见问题解答。 numpy文档有更多的信息。 http://docs.scipy.org/doc/numpy/user/basics.rec.html

如果您确实想采用纯粹的numpy路线,请注意结构化数组可以包含多维数组。 (注意指定dtype时的shape参数。)但是,这会很快变得比它的价值更复杂。

pandas术语中,您想要的是Panel。不过,你应该先get familiar with DataFrames

以下是您如何使用Pandas:

import numpy as np
import pandas

d = np.array(np.arange(3*2*6).reshape(3,2,6))

dat = pandas.Panel(d, items=['temp', 'precip', 'humidity'], 
                      major_axis=['yr1', 'yr2'], 
                      minor_axis=['jan', 'feb', 'mar', 'apr', 'may', 'jun'])

print dat['temp']
print dat.major_xs('yr1')
print dat.minor_xs('may')