9

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

假设我想要一个包含 3 个变量(比如温度、降水、湿度)数据的数组,并且每个变量的数据实际上是 2 年(行)和 6 个月数据(列)的二维数组,我可以创建它像这样:

>>> 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 ,但不知道我是如何设置的。

4

1 回答 1

12

实际上,您可以对结构化数组执行类似的操作,但通常麻烦多于其价值。

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

Pandas(建立在 numpy 之上)提供了你想要的东西,如果你想要这种类型的索引,它是一个更好的选择。还有Larry(用于标记数组),但它在很大程度上已被 Pandas 取代。

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

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

pandas术语来说,你想要的是一个Panel. 不过,您可能应该先熟悉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')
于 2012-06-27T21:26:44.337 回答