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ć!
'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
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
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. –