बदलना सुन्न सरणी टुपल करने के लिए


108

नोट: यह सामान्य टपल-टू-सरणी रूपांतरण के रिवर्स के लिए पूछ रहा है।

मुझे एक नेस्टेड टपल के रूप में एक (लिपटे सी ++) फ़ंक्शन के लिए एक तर्क पारित करना होगा। उदाहरण के लिए, निम्नलिखित कार्य करता है

X = MyFunction( ((2,2),(2,-2)) )

जबकि निम्नलिखित नहीं है

X = MyFunction( numpy.array(((2,2),(2,-2))) )
X = MyFunction( [[2,2],[2,-2]] )

दुर्भाग्य से, मैं जिस तर्क का उपयोग करना चाहूंगा वह मेरे लिए एक सुस्पष्ट सरणी के रूप में आता है। उस सरणी में हमेशा कुछ N के लिए आयाम 2xN होता है, जो काफी बड़ा हो सकता है।

वहाँ एक आसान तरीका है कि एक tuple में परिवर्तित है? मुझे पता है कि मैं बस के माध्यम से लूप कर सकता हूं, एक नया टपल बना सकता हूं, लेकिन यह पसंद करेगा कि क्या कोई अच्छा एक्सेस है जो कि खस्ता सरणी प्रदान करता है।

यदि यह संभव नहीं है कि जैसा कि मुझे आशा है कि यह अच्छा है, तो इसे करने का सबसे अच्छा तरीका क्या है?

जवाबों:



26

यहाँ एक समारोह है कि यह करूँगा:

def totuple(a):
    try:
        return tuple(totuple(i) for i in a)
    except TypeError:
        return a

और एक उदाहरण:

>>> array = numpy.array(((2,2),(2,-2)))
>>> totuple(array)
((2, 2), (2, -2))

1
अच्छा सामान्यीकरण। एक अजगर नौसिखिया के रूप में, हालांकि, मुझे आश्चर्य है कि अगर यह एक ऐसी स्थिति के अपवादों का उपयोग करने के लिए अच्छी शैली माना जाता है जो लगभग गैर-असाधारण स्थिति के रूप में आम है। कम से कम c ++ में, अपवादों द्वारा प्रवाह नियंत्रण आमतौर पर पर आधारित होता है। क्या परीक्षण करना बेहतर होगा type(a)==numpy.ndarray?
माइक

9
यह "डक-टाइपिंग" और ईएएफटी की अवधारणा के कारण अजगर में बहुत आम है, यहाँ और अधिक: docs.python.org/glossary.html#term-duck-typing । इस दृष्टिकोण का लाभ यह है कि यह किसी नेस्टेड अनुक्रम को नेस्टेड ट्यूपल्स में परिवर्तित करेगा, न कि केवल एक सरणी में। एक चीज जो मुझे करनी चाहिए थी वह यह है कि मैं निर्दिष्ट ब्लॉक द्वारा नियंत्रित की जाने वाली त्रुटियों को निर्दिष्ट करता हूं।
बी रीको

3
C ++ में, विभिन्न कारणों से सशर्त के सापेक्ष अपवाद धीमे हैं। पायथन में, वे प्रदर्शन के मामले में लगभग समान हैं - यह उन स्थानों में से एक है जिन्हें हमें दरवाजे पर अपने सी ++ अंतर्ज्ञान की जांच करनी है।
dbn

8

मैं संतुष्ट नहीं था, इसलिए मैंने आखिरकार इसका इस्तेमाल किया:

>>> a=numpy.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
       [4, 5, 6]])

>>> tuple(a.reshape(1, -1)[0])
(1, 2, 3, 4, 5, 6)

मुझे नहीं पता कि यह जल्दी है, लेकिन यह अधिक प्रभावी है;)


3
यह वह आकार नहीं था जो मैं टपल के लिए चाहता था।
माइक

5

एक अन्य विकल्प

tuple([tuple(row) for row in myarray])

यदि आप NumPy सरणियों को C ++ फ़ंक्शंस में पास कर रहे हैं, तो आप साइथन या SWIG का उपयोग करने की इच्छा भी कर सकते हैं।


यह टपल में परिवर्तित नहीं होता है। एक सूची में धर्मान्तरित?
पीटर

क्या तुमने कोशिश की? जब मैं दौड़ता हूं तो यह एक ट्यूपल बनाता है। ध्यान दें कि अंतिम फ़ंक्शन जिसे ट्यूपल कहा जाता है, जो एक ट्यूपल लौटाता है। यदि आपके पास बाहरी ट्यूपल के बिना केवल [...] भाग है, तो आपको ट्यूपल्स की एक सूची मिलेगी।
ग्रेग वॉन विंकेल

क्या कोई तेज़ विधि है?
विक्रोबोट

1
आप listवर्ग कोष्ठक को छोड़ कर मध्यवर्ती का निर्माण करने से बच सकते हैं, अर्थातtuple(tuple(row) for row in myarray)
19-13 को

1

यदि आप लंबे कट पसंद करते हैं, तो यहाँ a_m के लिए एक और तरीका है tuple (tuple (a_m.tolist ())

from numpy import array
a = array([[1, 2],
           [3, 4]])
tuple(tuple(a_m.tolist()) for a_m in a )

आउटपुट ((1, 2), (3, 4))

नोट बस (एक में a_m के लिए tuple (a_m.tolist ()) एक जनरेटर व्यक्त देगा। ग्रेग वॉन विंकेल के जवाब में @ norok2 की टिप्पणी से प्रेरित तरह

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.