具有多维numpy数组的python数据结构

时间:2016-06-21 01:01:37

标签: python numpy multidimensional-array

所以我有一些不规则的多维数据,我希望能够按'年龄'和'Z'值进行索引。

对于每个'年龄'和'Z',我有100个波长和关联通量的数组(前数据):

age    = np.array([10,20,30,40,50])
Z      = np.array([7,8])
waveln = np.array([np.array([a for a in arange(100)]) for b in arange(2*5)])
flux   = np.array([np.array([a*10 for a in arange(100)]) for b in arange(2*5)])

在这个例子中,waveln [0](一个包含100个条目的数组)和flux [0]将与

相关联
myData['age' = 10, 'Z' = 7]['waveln'] # which I want to return the waveln array

等等

myData['age' = 10, 'Z' = 7]['flux'] # which I want to return the flux array

我该如何设置?问题是,年龄和Z都是漂浮物......

THX,

1 个答案:

答案 0 :(得分:2)

您是否意识到waveln是一个10x100 2d数组,而不是数组数组?您可以使用

构建相同的内容
np.repeat(np.arange(100)[None,:],10,axis=0)

如果你真的希望waveln成为包含10个数组的1d数组,则必须使用替代对象dtype构造。

如定义flux=waveln*10,虽然我怀疑这只是说明性的价值。

但是让我们定义waveln所以它更有趣 - 所以每一行都是不同的

In [983]: waveln=np.arange(10)[:,None]+np.arange(100)[None,:]

我可以使用np.ix_Z数组中的age构建索引元组:

In [984]: np.ix_(Z,age)
Out[984]: 
(array([[7],
        [8]]), array([[10, 20, 30, 40, 50]]))

In [985]: waveln[np.ix_(Z,age)]
Out[985]: 
array([[17, 27, 37, 47, 57],
       [18, 28, 38, 48, 58]])

所以这已经选择了2行,也就是5列。

要执行myData['age' = 10, 'Z' = 7]['waveln'],我会使用__getitem__方法创建一个类。 Python[]中的表达式转换为传递给此方法的元组。但它会扼杀=语法。您不能在索引表达式中使用关键字参数。正确的字典语法是{'age':17, 'Z':7}dict(age=16, Z=12)

研究定义/numpy/lib/index_tricks.py的{​​{1}}文件,以获取有关如何构建自定义类的建议。

ix_允许您使用直接函数定义。