পাইথনে আপনি কীভাবে এলিপিসিস স্লাইসিং সিনট্যাক্স ব্যবহার করবেন?


157

এটি পাইথনের লুকানো বৈশিষ্ট্যগুলির মধ্যে প্রকাশিত হয়েছিল তবে আমি ভাল ডকুমেন্টেশন বা উদাহরণগুলি দেখতে পাচ্ছি না যা বৈশিষ্ট্যটি কীভাবে কাজ করে তা ব্যাখ্যা করে।

উত্তর:


102

Ellipsis, বা ...কোনও লুকানো বৈশিষ্ট্য নয়, এটি কেবল একটি ধ্রুবক। এটি জাভাস্ক্রিপ্ট ES6 এর থেকে একেবারেই আলাদা যেখানে এটি ভাষার বাক্য গঠনের একটি অংশ। কোনও বিল্টিন ক্লাস বা পাইথন ভাষার কন্ডাক্ট এটি ব্যবহার করে না।

সুতরাং এর সিনট্যাক্সটি সম্পূর্ণরূপে আপনার উপর নির্ভর করে বা অন্য কারও কাছে, এটি বোঝার জন্য লিখিত কোড রয়েছে।

নম্পি এটি ব্যবহার করেন, যেমন ডকুমেন্টেশনে বলা হয়েছে । এখানে কিছু উদাহরণ ।

আপনার নিজের ক্লাসে, আপনি এটি এটি ব্যবহার করতেন:

>>> 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
@ রনি: বক্তব্যটি ছিল এলিসপিসের কিছু কাস্টম ব্যবহার প্রদর্শন করা।
nosklo

7
লিঙ্কগুলি নষ্ট হয়ে গেছে বলে মনে হচ্ছে।
সুইফটসনামসেক

230

উপবৃত্তাকারগুলি উচ্চ মাত্রিক ডেটা স্ট্রাকচার কে টুকরো টুকরো করতে নিমপীতে ব্যবহৃত হয়।

এটি এই বিন্দুটি: বোঝাতে ডিজাইন করা হয়েছে , বহু মাত্রিক স্লাইসকে সমস্ত মাত্রায় প্রসারিত করতে অনেকগুলি সম্পূর্ণ স্লাইস ( ) সন্নিবেশ করানো হয়েছে

উদাহরণ :

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

এখন, আপনার কাছে অর্ডার 2x2x2x2 এর একটি 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] সকলের আইডি একই রকম।
মোহিতশর্মা44

@ মোহিতশর্মা 44 আমার মেশিনে নেই;) id()উভয়ের জন্য একই মান প্রদান করে। এছাড়াও চেক করা __array_interface__['data']একই মেমরি ঠিকানা দেখায়।
বোল্টজমানব্রেন

আমি দেখতে পেলাম যে আমরা a[indexes, ...]1-ডাইমেনশনাল অ্যারে এমনকি যখন ব্যবহার করতে পারি !
অ্যাক্টিগ্র্যান্ট

1
উপবৃত্তাকারগুলি শূন্য-মাত্রিক ডেটা স্ট্রাকচারের জন্যও কার্যকর। এগুলি কেবলমাত্র আমি স্কেলার নাম্পি.অ্যান্ডারায় লিখতে জানি, যেমন: my_scalar = np.asarray (3); my_scalar [...] = 5. আপনি যদি আমার_সালার করেন [[]] = 5, আপনি যথাযথভাবে একটি ত্রুটি পাবেন, কারণ এর পুনরাবৃত্তি করার জন্য 0 এর কোনও মাত্রা নেই।
ইলেকট্রিক

1
পছন্দ করুন অবশ্যই, আমার_স্ক্যালার [...] = স্কেলার_মূল্যটি ছোট, তবে আপনি উপরের মন্তব্যে বলেছিলেন, এটি আপনার একমাত্র উপায়। শুধু একটি বিকল্প দেওয়া।
কামাথলন

70

এটি এলিপসিসের আরেকটি ব্যবহার, যার টুকরোগুলির সাথে কোনও সম্পর্ক নেই: আমি প্রায়শই এটি সারির সাথে আন্ত-থ্রেড যোগাযোগে ব্যবহার করি, এটি একটি চিহ্ন হিসাবে "সম্পন্ন" হয়েছে; এটি সেখানে রয়েছে, এটি একটি অবজেক্ট, এটি একটি সিঙ্গলটন, এবং এর নামের অর্থ "অভাব", এবং এটি অতিরিক্ত ব্যবহৃত কিছুই নয় (যা সাধারণ তথ্য প্রবাহের অংশ হিসাবে একটি সারিতে স্থাপন করা যেতে পারে)। YMMV।


14
এটি কেবল পরিষ্কারভাবে বলা যায় না: "সম্পন্ন = অবজেক্ট ()" কোথাও এবং কেবল এটি ব্যবহার করবেন?
ব্র্যান্ডন রোডস

12
অগত্যা নয় - এর জন্য আপনাকে কোথাও ডোন = অবজেক্ট () বলতে হবে । সেন্টিনেল মানগুলি অগত্যা কোনও খারাপ জিনিস নয় - এবং অন্যথায় সেন্ডিনেল হিসাবে প্রায় অকেজো পাইথন সিঙ্গেলন ব্যবহার করা এতটা ভয়াবহ নয় যে আমি ব্যবহার করেছি যেখানে কোনওটি বিভ্রান্ত হবে না)।
রিক কোপেল্যান্ড

6
সম্পন্ন = অবজেক্ট () সম্পর্কে, আমি মনে করি এলিপসিস ব্যবহার করা ভাল, বিশেষত যদি আপনি এটি সারিগুলির সাথে যোগাযোগের জন্য ব্যবহার করেন। আপনি যদি ইনট্রা থ্রেড থেকে আন্ত-প্রক্রিয়া যোগাযোগে যান, অন্য প্রসেসে আইডি (সম্পন্ন) একই হবে না এবং একটি বস্তুর অপর থেকে আলাদা করার মতো কিছুই নেই। এলিপসিসের আইডিও একই রকম হবে না, তবে কমপক্ষে টাইপটি একই রকম হবে - এটি সিঙ্গলটনের মূল বিষয়।
ত্রিস্তান রিড

প্রশ্নটি বলছে "আপনি কীভাবে উপবৃত্তির ব্যবহার করবেন" তবে আমি বিশ্বাস করি আপনি এটি ভুল পথে নিয়েছেন। এর অনেক ব্যাখ্যা রয়েছে। তবে আমি মনে করি সঠিকটি হল: "এলিপসিস কীভাবে ব্যবহৃত হয়?" অর্থাত্ "আমার নিজের কোডে এলিসপিস ব্যবহার করতে আমার কী পদক্ষেপ নেওয়া উচিত"।
লিন্ডন হোয়াইট

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])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.