2013-07-19 8 views
6

मैं सी ++ में लिखे गए मैट्रिक्स की गणना करने के लिए बाहरी प्रोग्राम का उपयोग कर रहा हूं और boost::python के माध्यम से पाइथन के साथ इंटरफेस किया गया है। मैं इस सी सरणी को numpy पर पास करना चाहता हूं, और लेखकों के मुताबिक यह क्षमता पहले से ही numpy के obj.__array_interface__ के साथ लागू की गई है। अगर मैं एक अजगर स्क्रिप्ट में इस फोन और X लिए सी ++ वस्तु आवंटित मैं निम्नलिखित प्राप्त:Numpy's __array_interface__ वापस नहीं लौटा

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 पर स्पष्ट रूप से या इस समस्या के लिए एक समाधान करने का कोई तरीका है।

मैं सी ++ और पायथन मिश्रण करने के लिए वास्तव में काफी नया हूं, अगर इसका कोई मतलब नहीं है या मुझे किसी भी हिस्से पर विस्तार करने की आवश्यकता है तो मुझे बताएं!

+0

'np.array' एक शब्दकोश चाहता है। ऐसा लगता है कि 'एक्स .__ array_interface __()' एक शब्दकोश देता है। तो 'np.array नहीं होगा (एक्स .__ 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' वास्तव में एक 'साझा ऑब्जेक्ट' है और मुझे इसे कुशल बनाने में समझ की कमी है। – Daniel

+1

बदसूरत लेकिन एक्स .__ array_interface__ = X .__ array_interface __() असाइन करने के बारे में कैसे? यदि यह विफल हो जाता है तो आपको सी ++ में प्रवेश करना पड़ सकता है और उस तरफ एक numpy सरणी बनाना पड़ सकता है। –

उत्तर

2

__array_interface__ एक संपत्ति (उदाहरण चर) होना चाहिए, एक विधि नहीं। तो सी ++ में, या जहाँ भी 'sprint.Matrix' वस्तु परिभाषित किया गया है, यह बहुत होने के बदलने के बजाय:

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

संबंधित मुद्दे