2017-12-10 9 views
2

목록 목록으로 작동하는 클래스를 개발하려고합니다. 나는 이것을 개인을위한 타입으로, deap 프레임 워크로 전달할 필요가있다. 현재 numpy 객체 배열로 작업하고 있습니다. 여기에 코드가 있습니다. 내가 의 객체에 내가 오류가 발생사전 목록으로 사용되는 파이썬 개체

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' 

을 값을 전달하려고 할 때

import numpy 

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

는 그러나 어떤 제안을 환영합니다. 유형 생성을 용이하게하는 numpy를 사용하지 않고도 다른 방식으로 보여줄 수 있습니다. ndarray는 초기화하지 __init__()을 할 __new__()를 사용하여 같은

비슷한 질문 the documentation에 따르면 here

+1

아마도 dict를 numpy 배열에 해당하는 것으로 변환하려면'pandas'를 시도해야합니다. – Dark

+0

[here] (https://stackoverflow.com/questions/4535374/initialize-a-numpy-array)에서 언급 한 방법 중 하나를 살펴보고 자신의 논리에 따라 초기화 부분을 수정할 수 있습니다. –

답변

1

을 찾을 수 있습니다, 그것은 보인다. 특히 배열의 dtype__init__() 메서드가 실행되기 전에 이미 설정되어 있으므로 ndarray은 할당 할 메모리의 양을 알아야하기 때문에 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 생성자의 동작을 수정할 필요가없는 다른 작업을 수행 할 수 있습니다.

덧붙여 말하자면 ndarray을 서브 클래 싱하는 유일한 이유는 dtype=object을 생성자에 전달할 수 있기 때문에 대신 팩토리 함수를 사용하는 것입니다. 하지만 실제 코드에는 더 많은 정보가 있다고 가정합니다.

+0

Perfect! 고마워요 !!! – infiniator