【问题标题】:Naming dimensions in python?在python中命名尺寸?
【发布时间】:2013-05-06 15:49:05
【问题描述】:

有一点我非常感激,那就是在 python 中命名数组中的维度的能力。例如,我有一个 3 维的 numpy 数组,我必须定期将它沿特定维度求和。

所以我可以使用 ndarray a

sum(a, axis=2)

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

sum(a, axis="DI")

接近 NETCDF,但我不想实现完整的 netcdf 功能。

【问题讨论】:

  • 不需要问候和感谢。事实上,您甚至可以看到曾经(现在可能已经改进)用于删除它们的正则表达式here
  • 我能想到的最好方法是维护一个字典,其中包含从名称到轴号的映射。要么使用嵌套字典,要么在底部使用数组,但这可能比它的价值更麻烦(据我所知,在 numpy 中不是犹太教)。
  • 你真的需要DI 是一个字符串吗?如果你让DI = 2 在你的代码中的某个地方,你就可以做到np.sum(a, axis=DI)...

标签: python arrays numpy dimension axes


【解决方案1】:

@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

【讨论】:

  • 简洁优雅!你们中的一些人提出了这个解决方案,我也应该考虑一下。是的,@M456 的想法很好,但我会选择最简单的一个!谢谢!
【解决方案2】:

您可以为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 的要求非常接近。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2017-02-18
    • 2017-06-08
    • 1970-01-01
    相关资源
    最近更新 更多