所以我有一些不规则的多维数据,我希望能够按'年龄'和'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,
答案 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_
允许您使用直接函数定义。