x[...]
নীচের অর্থ কী ?
a = np.arange(6).reshape(2,3)
for x in np.nditer(a, op_flags=['readwrite']):
x[...] = 2 * x
x[...]
নীচের অর্থ কী ?
a = np.arange(6).reshape(2,3)
for x in np.nditer(a, op_flags=['readwrite']):
x[...] = 2 * x
উত্তর:
প্রস্তাবিত সদৃশটি পাইথন এলিপসিস অবজেক্টটি কী করবে? একটি সাধারণ 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
ক্ষেত্রে x
0 ডি অ্যারে, এবং পরিবর্তনীয়।
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 ম ম্লান) a
। x
তারপরে একটি 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 ম ম্লান) a
। x
তারপরে একটি 1 ডি অ্যারে হয় এবং হয় x[:] = ...
বা এর সাথে সংশোধন করা যায় x[...] = ...
।
nditer
শেষ পর্যন্ত এই পৃষ্ঠাটি পড়ুন এবং পরীক্ষা করুন । নিজে থেকে, nditer
যে দরকারী না python
। এটি পুনরাবৃত্তিকে গতি দেয় না - যতক্ষণ না আপনি নিজের কোডটি পোর্ট করেন cython
। np.ndindex
কয়েকটি অ-সংকলিত numpy
ফাংশনগুলির মধ্যে একটি যা ব্যবহার করে nditer
।