如何在python中重命名数组访问/写入变量?

时间:2013-01-14 18:38:00

标签: python arrays macros rename

我有一个对象,其中包含许多numpy数组中的字段(它们都是float64类型)。其中一些字段具有我想在访问/写入时使用的有意义的名称,但根据我目前的知识,我必须像这样访问和编写:

//access:
value = data[0]
//write:
data[0] = value

如果我在C工作,我会做这样的事情:

#define fieldname data[0]
//access:
value = fieldname
//write:
fieldname = value

如何在python中做一些干净的事情?

编辑: 所有这些字段必须保留在numpy数组中,因为它们通过使用numpy矩阵运算的线性变换得到更新。

编辑: 如果我写这个方法:

def fieldname(self):
  return self.data[0]

我的访问看起来符合要求,但我不能以同样的方式回写数据。

//access:
value = self.fieldname

(在此之前代码中省略了self,因为我觉得问题一般化为对象以外的情况。)

这篇关于重载赋值运算符的帖子可能接近我想要的内容: How to Emulate Assignment Operator Overloading in Python?

解: 编写带有字段名称的__getattr____setattr__方法,并对self.data执行必要的操作。当提供的字段名称与除数据之外的其他属性的字段名称匹配时,将不会调用这些名称,并在提供这些特殊属性的名称时添加从数据中获取内容的功能。

2 个答案:

答案 0 :(得分:1)

您发布的第一种方法看起来干净且对我来说足够清晰。请记住

value = data[0]

data[0] = value

只是

的语法糖
value = data.__getitem__(0)

data.__setitem__(0, value)

分别

如果你真的想真正想让行访问更清晰,可以考虑为不同的字段名定义常量。

FIELDNAME1, FIELDNAME2, FIELDNAME3 = range(3)

data[FIELDNAME1] = value

value = data[FIELDNAME2]

答案 1 :(得分:1)

如果你有所有领域的描述性标签,你可以做一个类似枚举的事情。 Python没有枚举,但有许多方法可以做类似的事情,如下所述:How can I represent an 'Enum' in Python?

例如,冒着通常的枚举辩论的风险,你可以做类似的事情:

def enum(**enums):
    return type('Enum', (), enums)

Numbers = enum(ONE=1, TWO=2, THREE='three')
print Numbers.ONE
print Numbers.TWO
print Numbers.THREE