2013-07-19 7 views
6

Używam zewnętrznego programu do obliczenia macierzy, która jest napisana w C++ i jest połączona z pythonem przez boost::python. Chciałbym przekazać tę tablicę C do numpy, a według autorów ta zdolność jest już zaimplementowana za pomocą numpy's obj.__array_interface__. Jeśli zgłoszę to w skrypcie Pythona i przypisać obiektu C++ do X mogę uzyskać następujące:Numpy's __array_interface__ nie zwraca 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 

Z mojego ograniczonego rozumienia Wierzę, że problem jest X.__array_interface__ nie jest faktycznie powrocie nic bez (). Czy istnieje sposób bezpośredniego przekazania tych argumentów do np.array lub obejścia tego problemu.

Jestem naprawdę całkiem nowy w mieszaniu C++ i Pythona, jeśli to nie ma sensu lub jeśli muszę wyjaśnić w jakiejkolwiek części, daj mi znać!

+0

'np.array' chce słownika. Wygląda na to, że 'X .__ array_interface __()' zwraca słownik. Więc nie byłoby np.array (X .__ array_interface __()) 'zrób to? – greatwolf

+1

To była moja pierwsza myśl, ale 'np.array' chce obiektu ze słownikiem w' __array_interface__', zobacz 'http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html '. Tak więc np.array (X .__ array_interface __()) 'zwraca słownik. Niestety 'np.array' jest w rzeczywistości' obiektem wspólnym 'i brakuje mi zrozumienia do manipulowania nim. – Daniel

+1

brzydki, ale co z przypisaniem X.__ array_interface__ = X .__ array_interface __()? Jeśli to się nie powiedzie, będziesz musiał zagłębić się w C++ i skonstruować tablicę numpy po tej stronie. –

Odpowiedz

2

__array_interface__ powinna być właściwością (zmienną instancji), a nie metodą. Tak więc w C++, czy gdziekolwiek przedmiotem „sprint.Matrix” jest zdefiniowana, zmienić go tak, że zamiast:

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

masz

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

Alternatywą byłoby zdefiniowanie niestandardowego opakowania klasa:

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

a następnie po prostu zrobić:

numpy.array(SprintMatrixWrapper(X)) 
+1

Działa świetnie! Naprawdę miałem nadzieję, że istnieje sposób na nakierowanie słownika na 'np.array'. Dam mu kilka dni na zaakceptowanie twojej odpowiedzi. +1 – Daniel