numpyサブクラスで属性を変更しても、サブクラス配列が変更されないのはなぜですか?

決定する

numpy配列をサブクラス化すると、次の問題が発生します

例えば:

import numpy

class Example(numpy.ndarray):
   def __new__(cls, x, y):
       dt = [('x', 'float'), ('y', 'float')]
       buffer = numpy.array(zip(x, y),dtype=dt)
       obj = super(Example, cls).__new__(cls, buffer.shape, dtype=dt,
                                          buffer=buffer)
       obj.x = numpy.array(x, dtype='float')
       obj.y = numpy.array(y, dtype='float')
       return obj

   def __array_finalize__(self, obj):
        if obj is None: return
        self.x = getattr(obj, 'x', None)
        self.y = getattr(obj, 'y', None)

obj.xとobj ['x']を使用して操作を行った場合、一方が他方を変更することはありません。たとえば、これらの操作は異なる結果を示します

x = [1,2,3,4]
y = [1,1,1,1]

obj = Example(x,y)
obj.x = obj.x / 2.
print obj.x, obj['x']

または

obj = Example(x,y)
obj['x'] = obj['x'] / 2.
print obj.x, obj['x']

それらの1つ(obj.xまたはobj ['x'])で操作を行うたびに、もう1つも変更されるようにするにはどうすればよいですか?

user2699

使用する[('x', 'float'), ('y', 'float')]データ型は、作成するためにnumpyの指示するように構成、配列の名前フィールドを持つxとしますyあなたが示したように、それらは括弧を使用してアクセスされます。これでobj.<name>、クラスに属性(を使用してアクセスも追加しましたただし、属性の新しい配列を作成しました。属性表記を修正するには、あなたが持っている必要がありますxし、yむしろ別の配列よりも、それらの名前によって配列フィールドにポイントを属性を。だから変更

   obj.x = numpy.array(x, dtype='float')
   obj.y = numpy.array(y, dtype='float')

   obj.x = obj['x']
   obj.y = obj['y']

これを編集すると、質問の2番目のテストケースのみが修正されます。割り当てるxか、yまだ属性として新しいオブジェクトを割り当てではなく、更新しますxyこれを修正するに__setattr__は、クラスメソッドを変更する必要がありますここを参照

def __setattr__(self, attr, value):
    if attr in ['x', 'y']:
         getattr(self, attr)[:] = attr
    else:
         setattr(self, attr, value)

ただし、Numpyには、属性としてフィールドにアクセスできるようにする配列型がすでにあります。このように使えます

obj = np.array(np.r_[x, y], dtype=[('x', 'float'), ('y', 'float')]) 
obj = obj.view(np.recarray)  

おめでとうございます!レコード配列を効果的に再実装しましたnp.recarray属性または関数ndarrayが持つ名前に一致するフィールドへのアクセスは許可されません。したがって、コードで許可されているのに、のような名前meanまたはndim外れている名前があります)。すでに持っている何かを作成するのに何時間も費やすとき、それは常に良い(そして非常にイライラする)兆候です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

クラス属性を変更してもPythonのオブジェクト属性が変更されないのはなぜですか?

分類Dev

サブスクライブされた配列がまだ変更されていないのに、useEffectが呼び出されるのはなぜですか?

分類Dev

XMLテキストを変更してもサイズが変更されないのはなぜですか?

分類Dev

サブクラス化時に関数が変更されても、関数に渡されるプロトコルのデフォルト値が変更されないのはなぜですか?

分類Dev

サブクラス変数が存在しないのはなぜですか?

分類Dev

「$$」がbashパイプラインで変更されないのはなぜですか?彼らはサブプロセスを開始しませんか?

分類Dev

クラスオブジェクトを介してオブジェクト自体を変更しても機能しないのはなぜですか?

分類Dev

finallyブロックで返される変数を変更しても、戻り値が変更されないのはなぜですか?

分類Dev

DefaultStyleKeyがサブクラスのデフォルトスタイルを変更しないのはなぜですか?

分類Dev

引数として渡した後、プリミティブラッパークラスが変更されないのはなぜですか?

分類Dev

ファイルの名前を変更してもチェックサムが変更されないのはなぜですか?

分類Dev

DynamoDBでインデックス/テーブルの名前変更がサポートされていないのはなぜですか?

分類Dev

Swift:タイマーを使用してテキスト属性を変更しても、ラベルが更新されないのはなぜですか?

分類Dev

テキストボックスでプロキシを変更しても、プロキシが変更されないのはなぜですか?C#.NET

分類Dev

「mut」なしで変数を変更しても、可変性エラーがスローされないのはなぜですか?

分類Dev

RxJS:サブスクライブ内で「これ」が定義されていないのはなぜですか

分類Dev

入力クラスが幅を変更しないのはなぜですか?

分類Dev

もともとサブクラスオブジェクトとして作成されたオブジェクトを別のサブクラスオブジェクトに変更することはできますか?

分類Dev

あるクラスで変数を編集しても、別のクラスでは変数が変更されないようです

分類Dev

Pythonマルチプロセスクラスが属性を変更しないのはなぜですか?

分類Dev

ブラウザのサイズが変更されたときにdivのサイズが変更されないのはなぜですか?

分類Dev

別のブランチをチェックアウトした後も、ステージングされていない変更がまだ存在するのはなぜですか?

分類Dev

get / setを使用してオブジェクトが変更されないのはなぜですか?

分類Dev

Google Play APIでサブスクリプションをキャンセルした後、有効期限が変更されるのはなぜですか?

分類Dev

Swift iOS-クラスオブジェクトの配列をループしてプロパティを変更できるが、構造体はできないのはなぜですか

分類Dev

オブジェクトがクラス変数の値を変更できるのはなぜですか?

分類Dev

componentDidMountライフサイクルに状態の変更が表示されないのはなぜですか?

分類Dev

realloc関数を使用して、動的配列のスタックのサイズを変更できないのはなぜですか?

分類Dev

ASP.NET MVCバンドルを使用しているときに、クライアントがサーバーにアクセスしてファイルが変更されているかどうかを確認するのはなぜですか?

Related 関連記事

  1. 1

    クラス属性を変更してもPythonのオブジェクト属性が変更されないのはなぜですか?

  2. 2

    サブスクライブされた配列がまだ変更されていないのに、useEffectが呼び出されるのはなぜですか?

  3. 3

    XMLテキストを変更してもサイズが変更されないのはなぜですか?

  4. 4

    サブクラス化時に関数が変更されても、関数に渡されるプロトコルのデフォルト値が変更されないのはなぜですか?

  5. 5

    サブクラス変数が存在しないのはなぜですか?

  6. 6

    「$$」がbashパイプラインで変更されないのはなぜですか?彼らはサブプロセスを開始しませんか?

  7. 7

    クラスオブジェクトを介してオブジェクト自体を変更しても機能しないのはなぜですか?

  8. 8

    finallyブロックで返される変数を変更しても、戻り値が変更されないのはなぜですか?

  9. 9

    DefaultStyleKeyがサブクラスのデフォルトスタイルを変更しないのはなぜですか?

  10. 10

    引数として渡した後、プリミティブラッパークラスが変更されないのはなぜですか?

  11. 11

    ファイルの名前を変更してもチェックサムが変更されないのはなぜですか?

  12. 12

    DynamoDBでインデックス/テーブルの名前変更がサポートされていないのはなぜですか?

  13. 13

    Swift:タイマーを使用してテキスト属性を変更しても、ラベルが更新されないのはなぜですか?

  14. 14

    テキストボックスでプロキシを変更しても、プロキシが変更されないのはなぜですか?C#.NET

  15. 15

    「mut」なしで変数を変更しても、可変性エラーがスローされないのはなぜですか?

  16. 16

    RxJS:サブスクライブ内で「これ」が定義されていないのはなぜですか

  17. 17

    入力クラスが幅を変更しないのはなぜですか?

  18. 18

    もともとサブクラスオブジェクトとして作成されたオブジェクトを別のサブクラスオブジェクトに変更することはできますか?

  19. 19

    あるクラスで変数を編集しても、別のクラスでは変数が変更されないようです

  20. 20

    Pythonマルチプロセスクラスが属性を変更しないのはなぜですか?

  21. 21

    ブラウザのサイズが変更されたときにdivのサイズが変更されないのはなぜですか?

  22. 22

    別のブランチをチェックアウトした後も、ステージングされていない変更がまだ存在するのはなぜですか?

  23. 23

    get / setを使用してオブジェクトが変更されないのはなぜですか?

  24. 24

    Google Play APIでサブスクリプションをキャンセルした後、有効期限が変更されるのはなぜですか?

  25. 25

    Swift iOS-クラスオブジェクトの配列をループしてプロパティを変更できるが、構造体はできないのはなぜですか

  26. 26

    オブジェクトがクラス変数の値を変更できるのはなぜですか?

  27. 27

    componentDidMountライフサイクルに状態の変更が表示されないのはなぜですか?

  28. 28

    realloc関数を使用して、動的配列のスタックのサイズを変更できないのはなぜですか?

  29. 29

    ASP.NET MVCバンドルを使用しているときに、クライアントがサーバーにアクセスしてファイルが変更されているかどうかを確認するのはなぜですか?

ホットタグ

アーカイブ