आप पायथन में इलिप्सिस स्लाइसिंग सिंटैक्स का उपयोग कैसे करते हैं?


जवाबों:


102

Ellipsis, या ... एक छिपी हुई विशेषता नहीं है, यह सिर्फ एक स्थिर है। यह जावास्क्रिप्ट ईएस 6, जहां यह भाषा वाक्य रचना का एक हिस्सा है, से काफी भिन्न है। कोई भी निर्मित वर्ग या पायथन भाषा की कमी इसका उपयोग नहीं करती है।

तो इसके लिए वाक्यविन्यास पूरी तरह से आप या किसी और पर निर्भर करता है, इसे समझने के लिए लिखित कोड।

जैसा कि प्रलेखन में कहा गया है, नम्पी इसका उपयोग करती है । कुछ उदाहरण यहाँ

अपनी कक्षा में, आप इसे इस तरह उपयोग करेंगे:

>>> class TestEllipsis(object):
...     def __getitem__(self, item):
...         if item is Ellipsis:
...             return "Returning all items"
...         else:
...             return "return %r items" % item
... 
>>> x = TestEllipsis()
>>> print x[2]
return 2 items
>>> print x[...]
Returning all items

बेशक, अजगर प्रलेखन , और भाषा संदर्भ है । लेकिन वे बहुत उपयोगी नहीं हैं।


6
सभी मदों को कहने के "प्रॉपर" तरीके से काफी टूटा हुआ लग रहा है >>> x [:] >>> x [:, 1: 2]
रोनी

30
@ रॉनी: बिंदु एलिप्सिस के कुछ कस्टम उपयोग को प्रदर्शित करना था।
नोसकोलो

7
लिंक टूटे हुए दिखाई देते हैं।
स्विफ्टनामेस

231

दीर्घवृत्त का उपयोग उच्च खगोलीय डेटा संरचनाओं को स्लाइस करने के लिए खसखस ​​में किया जाता है।

यह इस बिंदु पर: मतलब करने के लिए डिज़ाइन किया गया है , सभी आयामों के लिए बहुआयामी टुकड़ा का विस्तार करने के लिए कई पूर्ण स्लाइस ( ) के रूप में डालें

उदाहरण :

>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)

अब, आपके पास ऑर्डर 2x2x2x2 का 4-आयामी मैट्रिक्स है। 4 वें आयाम में सभी पहले तत्वों का चयन करने के लिए, आप एलिप्सिस नोटेशन का उपयोग कर सकते हैं

>>> a[..., 0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

जो के बराबर है

>>> a[:,:,:,0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

अपने स्वयं के कार्यान्वयन में, आप ऊपर बताए गए अनुबंध को अनदेखा करने के लिए स्वतंत्र हैं और जो कुछ भी आप फिट देखते हैं, उसका उपयोग करें।


हो सकता है कि मैं गलत हूं, लेकिन क्या ऐसा नहीं है कि a[:,:,:,0]कोई कॉपी a[...,0]लौटाएगा और "दृश्य" लौटाएगा और कॉपी नहीं? मैंने id()दोनों संस्करणों के लिए और 3-मंद सरणी के लिए दौड़ने की कोशिश की : a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2] सभी में अलग-अलग आईडी हैं जबकि a[..., 0], a[..., 1], a[..., 2] सभी में एक ही आईडी है।
mohitsharma44

@ mohitsharma44 मेरी मशीन पर नहीं;) id()दोनों के लिए समान मूल्य लौटाता है। साथ ही चेक करने __array_interface__['data']से एक ही मैमोरी एड्रेस पता चलता है।
बोल्ट्ज़मनब्रेन

मुझे लगता है कि हम उपयोग कर सकते हैं, a[indexes, ...]जबकि एक 1-मंदक सरणी भी है!
अक्जेंट्री

1
एलिपेस शून्य-आयामी डेटा संरचनाओं के लिए भी उपयोगी हैं। वे एकमात्र ऐसे तरीके हैं, जिनके बारे में मैं स्केलर में लिखना जानता हूं। जैसे, my_scalar = np.asarray (3); my_scalar [...] = 5. यदि आप my_scalar [:] = 5 करते हैं, तो आप सही ढंग से एक त्रुटि प्राप्त कर सकते हैं, क्योंकि इसके लिए कोई आयाम 0 नहीं है: पर पुनरावृति करने के लिए।
सुपरइलेक्ट्रिक

1
@ सुपरप्रूफ आप my_scalar.itemset (स्केलरवल्यू) का भी उपयोग कर सकते हैं। बेशक, my_scalar [...] = scalar_value कम है, लेकिन आपने उपरोक्त टिप्पणी में कहा, कि यह एकमात्र तरीका है जिसे आप जानते हैं। बस एक विकल्प दे रहा हूं।
kamathln

70

यह एलिप्सिस के लिए एक और उपयोग है, जिसका स्लाइस से कोई लेना-देना नहीं है: मैं अक्सर इसे क्यू के साथ इंट्रा-थ्रेड संचार में उपयोग करता हूं, एक निशान के रूप में जो "संकेत" करता है; यह वहां है, यह एक वस्तु है, यह एक सिंगलटन है, और इसके नाम का अर्थ है "कमी", और यह अति प्रयोग नहीं है (जो सामान्य डेटा प्रवाह के हिस्से के रूप में एक कतार में रखा जा सकता है)। YMMV।


14
कहीं यह कहने के लिए स्पष्ट नहीं हो सकता है: "कहीं = वस्तु ()" कहीं और बस इसका उपयोग करें?
ब्रैंडन रोड्स

12
जरूरी नहीं - यह आपको वास्तव में कहीं न कहीं डोन = ऑब्जेक्ट () कहने की आवश्यकता है। प्रहरी मूल्य आवश्यक रूप से एक बुरी बात नहीं है - और अन्यथा लगभग-बेकार पायथन सिंगलटन का उपयोग कर रहे हैं क्योंकि सेंटिनल इतना भयानक नहीं है आईएमओ (एलिप्सिस और () वे हैं जिनका मैंने उपयोग किया है जहां कोई भी भ्रमित नहीं होगा)।
रिक कोपलैंड

6
Done = object () के बारे में, मुझे लगता है कि Ellipsis का उपयोग करना बेहतर है, खासकर यदि आप इसे कतारों के साथ संचार के लिए उपयोग कर रहे हैं। यदि आप इंट्रा-थ्रेड से इंट्रा-प्रोसेस संचार में जाते हैं, तो आईडी (डोन) अन्य प्रक्रिया में समान नहीं होगा, और एक वस्तु को दूसरे से अलग करने के लिए कुछ भी नहीं है। एलिप्सिस की आईडी भी समान नहीं होगी, लेकिन कम से कम प्रकार एक ही होगा - यह एक सिंगलटन का बिंदु है।
त्रिस्टान रीड

प्रश्न कहता है "आप एलिप्सिस का उपयोग कैसे करते हैं" लेकिन मेरा मानना ​​है कि आपने इसे गलत तरीके से लिया। इसकी कई व्याख्याएं हैं। लेकिन मुझे लगता है कि सही है: "एलिप्सिस का उपयोग कैसे किया जाता है?" यानी "मुझे अपने कोड में एलिप्सिस का उपयोग करने के लिए क्या कदम उठाने चाहिए।"
लिंडन व्हाइट

6

जैसा कि अन्य उत्तरों में कहा गया है, इसका उपयोग स्लाइस बनाने के लिए किया जा सकता है। उपयोगी जब आप कई पूर्ण स्लाइस नोटेशन नहीं लिखना चाहते हैं (: ) , या जब आप सरणी के आयामी होने की गतिशीलता पर सिर्फ यकीन नहीं कर रहे हैं।

मैंने हाइलाइट करने के लिए जो महत्वपूर्ण समझा, और जो अन्य उत्तरों पर गायब था, वह यह है कि इसका उपयोग तब भी किया जा सकता है, जब कोई और आयाम न हो।

उदाहरण:

>>> from numpy import arange
>>> a = arange(4).reshape(2,2)

इसके परिणामस्वरूप त्रुटि होगी:

>>> a[:,0,:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices for array

यह काम करेगा:

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