2017-12-10 5 views
2

リストのリストとして動作するクラスを開発しようとしています。私はそれを個人のための型として、deapフレームワークで渡す必要があります。現在、私はnumpyのオブジェクト配列で作業しています。ここにコードがあります。辞書のリストのリストとしてのPythonオブジェクト

import numpy 

class MyArray(numpy.ndarray): 
    def __init__(self, dim): 
     numpy.ndarray.__init__(dim, dtype=object) 

しかし、私はのオブジェクトに値を渡すためにしようと、

a = MyArray((2, 2)) 
a[0][0] = {'procID': 5} 

私はエラーを取得し、

Traceback (most recent call last): 
File "D:/PythonProjects/NSGA/src/test.py", line 23, in <module> 
    'procID': 5 
TypeError: float() argument must be a string or a number, not 'dict' 

任意の提案を歓迎します。タイプの作成を容易にするnumpyを使用せずに、私に別の方法を示すこともできます。 ndarrayが初期化、ない__init__()を行うために__new__()を使用するように

同様の質問がthe documentationによるhere

+1

dictをnumpyの配列に変換するには、 'pandas'を試してください。 – Dark

+0

[here](https://stackoverflow.com/questions/4535374/initialize-a-numpy-array)に記載されている方法の1つを調べて、独自のロジックに従って初期化部分を変更することができます –

答えて

1

を見つけることができる、それが見えます。特に、配列のdtypeは、__init__()メソッドが実行される前に既に設定されています。ndarrayは、割り当てようとするメモリの量を知る必要があるため、意味があります。 (メモリ割り当ては__new__()であり、__init__()ではありません)__new__()を無効にしてdtypeパラメータをndarrayに設定する必要があります。もちろん

class MyArray(numpy.ndarray): 
    def __new__(cls, dim): 
     return numpy.ndarray.__new__(cls, dim, dtype=object) 

、あなたはは、あなたのクラスで__init__()メソッドを持つことができます。 __new__()が終了した後に実行され、追加の属性を設定するのに適切な場所になるか、またはndarrayコンストラクタの動作を変更する必要がないことがあります。あなたはコンストラクタにdtype=objectを渡すことができるようにあなたがndarrayをサブクラス化している唯一の理由がある場合

ちなみに、私はだけではなく、工場の機能を使用すると思います。しかし、私はあなたの実際のコードでそれ以上のことがあると仮定しています。

+0

Perfect!どうもありがとう!!! – infiniator

関連する問題