【问题标题】:How can I rename an array access/write to a variable in python?如何重命名数组访问/写入python中的变量?
【发布时间】:2013-01-14 18:38:00
【问题描述】:

我有一个对象,它在一个 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 进行必要的操作。当提供的字段名称与数据以外的另一个属性的字段名称匹配时,这些将不会被调用,并在提供这些特殊属性的名称时添加从数据中获取内容的功能。

【问题讨论】:

  • 没有足够的上下文来判断这是否适合您,但请查看 NamedTuple 类:docs.python.org/2/library/…
  • 这不完全一样,因为 Python 使用引用,在这种情况下指向不可变对象。如果data[0] 的值改变了value 的值不会改变。它将是第一次引用时的任何内容。

标签: python arrays macros rename


【解决方案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]

【讨论】:

  • 这会很好用。我必须使用字段名称进行访问,因为字段很多,而且很难记住每个字段的编号。
  • @user1123936:事实上,python 只是不做指针运算。您可以向后弯曲(形象地)并编写一些像指针一样工作的东西,但我想说这比通过上面的键/索引访问值更令人困惑。等效的python习语是:“应该有一种——最好只有一种——明显的方式来做到这一点。”
【解决方案2】:

如果你的所有字段都有描述性标签,你可以做类似枚举的事情。 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

【讨论】:

  • 如果我使用这个,我的访问看起来会是这样的:value = data[Numbers.FIELDNAME],这不如 value = data[FIELDNAME],在 Joel Cornett 的解决方案中。
  • @user1123936:其实我更喜欢这种方法,因为它减少了命名空间的混乱。
  • 我的意思实际上是 data.ONEdata.TWO 等。但你和 Joel Cornett 是对的。我撤回了我的提议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 2021-04-29
  • 2017-11-21
  • 1970-01-01
相关资源
最近更新 更多