2013-07-19 3 views
6

외부 프로그램을 사용하여 C++로 작성된 행렬을 파이썬과 인터페이스하는 경우는 boost::python입니다. 이 C 배열을 numpy에 전달하고 싶습니다. 작성자에 따르면이 기능은 numpy의 obj.__array_interface__으로 이미 구현되어 있습니다. 내가 파이썬 스크립트에서이 전화 X에 C++ 객체를 할당하면 나는 다음과 같은 구하십시오Numpy의 __array_interface__가 dict을 반환하지 않음

print X 
#<sprint.Matrix object at 0x107c5c320> 

print X.__array_interface__ 
#<bound method Matrix.__array_interface__ of <sprint.Matrix object at 0x107c5c320>> 

print X.__array_interface__() 
#{'shape': (5, 5), 'data': (4416696960, True), 'typestr': '<f8'} 

print np.array(X) 
#Traceback (most recent call last): 
# File "<string>", line 96, in <module> 
#ValueError: Invalid __array_interface__ value, must be a dict 

을 내 제한된 이해에서 나는 문제가 X.__array_interface__ 실제로 ()없이 아무것도 반환하지 않습니다 믿습니다. 이러한 문제를 명시 적으로 np.array에 전달하거나이 문제를 해결할 방법이 있습니까?

저는 C++과 파이썬을 혼합하는 것에 매우 새로운 것입니다. 이것이 의미가 없거나 어떤 부분에 대해 자세히 설명해야 할 필요가 있다면 알려주세요!

+0

'np.array'는 사전을 원합니다. 'X .__ array_interface __()'는 사전을 반환합니다. 그래서'np.array (X .__ array_interface __())'하지 않겠는가? – greatwolf

+1

그게 내 생각이기도하지만'np.array'는'__array_interface__'에 사전이있는 객체를 원합니다.'http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html '. 따라서'np.array (X .__ array_interface __())'는 사전을 리턴합니다. 불행히도'np.array'는 실제로'공유 객체 (shared object) '이고 그것을 조작하기위한 이해가 부족합니다. – Daniel

+1

ugly하지만 X .__ array_interface__ = X .__ array_interface __()를 할당하는 방법은 무엇입니까? 이것이 실패하면 C++을 탐구하고 그면에 질의없는 배열을 만들어야 할 것입니다. –

답변

2

__array_interface__는 메서드가 아닌 속성 (인스턴스 변수)이어야합니다. 'sprint.Matrix'개체가 정의 된 곳 그래서 C++에, 또는, 필요없이 대신 이렇게 변경 :

print X.__array_interface__ 
#<bound method Matrix.__array_interface__ of <sprint.Matrix object at 0x107c5c320>> 

당신이

print X.__array_interface__ 
#{'shape': (5, 5), 'data': (4416696960, True), 'typestr': '<f8'} 

이 또 다른 사용자 지정 래퍼를 정의하는 것 클래스 : 다음

class SprintMatrixWrapper(object): 
    def __init__(self, sprint_matrix): 
     self.__array_interface__ = sprint_matrix.__array_interface__() 

간단하게 수행

numpy.array(SprintMatrixWrapper(X)) 
+1

훌륭한 작품! 사전을'np.array'에 넘겨 줄 방법이 있었으면 좋겠다. 나는 당신의 대답을 받아 들일 며칠을 드릴 것입니다. +1 – Daniel