কোন সংখ্যার মতো দেখতে ইন্ডেক্স করার সময় পাইথনের "তিনটি বিন্দু" অর্থ কী?


90

x[...]নীচের অর্থ কী ?

a = np.arange(6).reshape(2,3)
for x in np.nditer(a, op_flags=['readwrite']):
    x[...] = 2 * x

4
এটি কোনও তালিকা নয়।
ব্যবহারকারী 2357112


4
এটি বোঝার অবশ্যই মজাদার উপায় হ'ল জেমস পাওলের কথাবার্তা youtube.com/watch?v=65_-6kEAq58
সারোস

উত্তর:


70

প্রস্তাবিত সদৃশটি পাইথন এলিপসিস অবজেক্টটি কী করবে? একটি সাধারণ pythonপ্রসঙ্গে প্রশ্নের উত্তর দেয় , একটি nditerলুপে এর ব্যবহারের প্রয়োজন, আমি মনে করি, যুক্ত তথ্য।

https://docs.scipy.org/doc/numpy/references/arrays.nditer.html#modified-array-values

পাইথনগুলিতে নিয়মিত অ্যাসাইনমেন্ট কেবল স্থানে বিদ্যমান ভেরিয়েবলটি পরিবর্তনের পরিবর্তে স্থানীয় বা বৈশ্বিক চলক অভিধানে একটি রেফারেন্স পরিবর্তন করে। এর অর্থ হল যে কেবল এক্সকে নির্ধারণ করা অ্যারের উপাদানের সাথে মানটি রাখবে না, বরং আপনাকে নির্ধারিত মানের রেফারেন্স হিসাবে অ্যারে উপাদান রেফারেন্স হতে এক্স স্যুইচ করুন। অ্যারের উপাদানটি প্রকৃতপক্ষে পরিবর্তন করতে, এক্সকে উপবৃত্তের সাথে সূচী করা উচিত।

বিভাগে আপনার কোড উদাহরণ অন্তর্ভুক্ত।

সুতরাং আমার কথায়, স্থান x[...] = ...পরিবর্তন xকরে; ভেরিয়েবলের x = ...লিঙ্কটি ভেঙে nditerফেলত, এবং এটি পরিবর্তন করে না। এটি এর মতো x[:] = ...তবে কোনও মাত্রার অ্যারে (0 ডি সহ) সহ কাজ করে। এই প্রসঙ্গে xকেবল একটি সংখ্যা নয়, এটি একটি অ্যারে।

সম্ভবত এই nditerপুনরাবৃত্তির নিকটতম জিনিসটি nditerহল:

In [667]: for i, x in np.ndenumerate(a):
     ...:     print(i, x)
     ...:     a[i] = 2 * x
     ...:     
(0, 0) 0
(0, 1) 1
...
(1, 2) 5
In [668]: a
Out[668]: 
array([[ 0,  2,  4],
       [ 6,  8, 10]])

লক্ষ্য করুন যে আমাকে a[i]সরাসরি সূচক এবং সংশোধন করতে হয়েছিল । আমি ব্যবহার করতে পারতাম না x = 2*x,। এই পুনরাবৃত্তিতে xএকটি স্কেলার, এবং এইভাবে পরিবর্তনীয় নয়

In [669]: for i,x in np.ndenumerate(a):
     ...:     x[...] = 2 * x
  ...
TypeError: 'numpy.int32' object does not support item assignment

তবে nditerক্ষেত্রে x0 ডি অ্যারে, এবং পরিবর্তনীয়।

In [671]: for x in np.nditer(a, op_flags=['readwrite']):
     ...:     print(x, type(x), x.shape)
     ...:     x[...] = 2 * x
     ...:     
0 <class 'numpy.ndarray'> ()
4 <class 'numpy.ndarray'> ()
...

এবং এটি 0 ডি, এর x[:]পরিবর্তে ব্যবহার করা যাবে নাx[...]

----> 3     x[:] = 2 * x
IndexError: too many indices for array

একটি সহজ অ্যারে পুনরাবৃত্তি অন্তর্দৃষ্টি দিতে পারে:

In [675]: for x in a:
     ...:     print(x, x.shape)
     ...:     x[:] = 2 * x
     ...:     
[ 0  8 16] (3,)
[24 32 40] (3,)

এর সারিগুলিতে পুনরাবৃত্তি হয় (1 ম ম্লান) axতারপরে একটি 1 ডি অ্যারে হয় এবং হয় x[:]=...বা এর সাথে সংশোধন করা যায় x[...]=...

এবং যদি আমি যোগ external_loopপরবর্তী থেকে পতাকা অধ্যায় , xএখন একটি 1d অ্যারে, এবং x[:] =কাজ করবে। তবে x[...] =এখনও কাজ করে এবং আরও সাধারণ। x[...]অন্যান্য সমস্ত nditerউদাহরণ ব্যবহৃত হয় ।

In [677]: for x in np.nditer(a, op_flags=['readwrite'], flags=['external_loop']):
     ...:     print(x, type(x), x.shape)
     ...:     x[...] = 2 * x
[ 0 16 32 48 64 80] <class 'numpy.ndarray'> (6,)

এই সাধারণ সারি পুনরাবৃত্তির তুলনা করুন (2 ডি অ্যারেতে):

In [675]: for x in a:
     ...:     print(x, x.shape)
     ...:     x[:] = 2 * x
     ...:     
[ 0  8 16] (3,)
[24 32 40] (3,)

এর সারিগুলিতে পুনরাবৃত্তি হয় (1 ম ম্লান) axতারপরে একটি 1 ডি অ্যারে হয় এবং হয় x[:] = ...বা এর সাথে সংশোধন করা যায় x[...] = ...

nditerশেষ পর্যন্ত এই পৃষ্ঠাটি পড়ুন এবং পরীক্ষা করুন । নিজে থেকে, nditerযে দরকারী না python। এটি পুনরাবৃত্তিকে গতি দেয় না - যতক্ষণ না আপনি নিজের কোডটি পোর্ট করেন cythonnp.ndindexকয়েকটি অ-সংকলিত numpyফাংশনগুলির মধ্যে একটি যা ব্যবহার করে nditer


মনে রাখবেন যে x [1,:, ...] এর মতো জিনিসগুলিও একটি অনুমোদিত সিনট্যাক্স। ভবিষ্যতের রেফারেন্সের জন্য বামে।
বার্গার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.