有一点我非常感激,那就是在 python 中命名数组中的维度的能力。例如,我有一个 3 维的 numpy 数组,我必须定期将它沿特定维度求和。
所以我可以使用 ndarray a:
sum(a, axis=2)
如果我的相关维度是最后一个,但我想让它“与位置无关”,即用户可以提供任何数组,只要他指定“这个维度是”DI“”(例如,对于“感兴趣的维度” )。所以基本上我希望能够写:
sum(a, axis="DI")
接近 NETCDF,但我不想实现整个 netcdf 功能。
您可以编写一个薄包装的子类到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 的要求非常接近。
@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