0

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?

解決策:フィールド名を取り、self.data に対して必要な操作を実行するメソッドを記述します__getattr____setattr__提供されたフィールド名がデータ以外の別の属性のフィールド名と一致する場合、これらは呼び出されず、これらの特別な属性の名前が提供されたときにデータから内容を取得する機能を追加します。

4

2 に答える 2

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]
于 2013-01-14T19:25:05.347 に答える
1

すべてのフィールドに説明ラベルがある場合は、列挙型のようなことができます。Python には列挙型はありませんが、ここで説明されているように、同様のことを行う方法は多数あります: 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
于 2013-01-14T20:51:17.577 に答える