在python中命名维度?

时间:2013-05-06 15:49:06

标签: python arrays numpy dimension axes

有些东西我非常欣赏,它能够在python中命名数组中的维度。例如,我有一个3维的numpy数组,我将经常不得不按特定维度求和。

所以我可以使用ndarray a

sum(a, axis=2)

如果我的相关维度是最后一个,但我想让它“位置无关”,即用户可以提供任何数组,只要他指定“此维度为”DI“”(例如,对于“维度”出于兴趣”)。所以我基本上希望能够写下来:

sum(a, axis="DI")

关闭NETCDF,但我不想实现整个netcdf功能。

2 个答案:

答案 0 :(得分:3)

您可以将精简包装的子类写入np.ndarray。但是维护维度和名称之间的对应关系可能很棘手。

class NamedArray(np.ndarray):
    def __new__(cls, *args, **kwargs):
        obj = np.ndarray(args[0], **kwargs).view(cls)
        return obj

    def __init__(self, *args, **kwargs):
        self.dim_names = None
        if len(args) == 2:
            self.dim_names = args[1]

    def sum(self, *args, **kwargs):
        if (self.dim_names is not None) and (type(kwargs['axis']) == str):
            axis_name = kwargs.pop('axis')
            axis_ind = self.dim_names.index(axis_name)
            kwargs['axis'] = axis_ind
        return super().sum(*args, **kwargs)

#regular ndarray
a = NamedArray([1,2,3], dtype=np.float32)

#ndarray with dimension names
b = NamedArray([1,2,3], ('d1', 'd2', 'd3'), dtype=np.float32)

编辑: Pandas DataFrame现在与OP提出的问题非常接近。

答案 1 :(得分:3)

@ M456的想法很聪明,但如果你对几个数组有相同的命名方案,我认为更简单的解决方案就是使用字典:

axes = { 'DA': 0, 'DB':1 }
a.sum(axes['DA'])

甚至只是变量:

DA, DB, DC = range(3)
a.sum(DA)

如果它应该是你的最后一个(或倒数第二个)轴,只需使用-1(或-2等):

a.shape
#(2,3,4)

np.all(a.sum(2) == a.sum(-1))
#True
np.all(a.sum(0) == a.sum(-3))
#True