Numpy.newaxis কীভাবে কাজ করে এবং কখন এটি ব্যবহার করবে?


185

আমি যখন চেষ্টা করি

numpy.newaxis

ফলাফলটি আমাকে ০ থেকে ১ পর্যন্ত এক্স-অক্ষের সাথে একটি 2-ডি প্লট ফ্রেম দেয় তবে যাইহোক, যখন আমি numpy.newaxisকোনও ভেক্টরকে টুকরো টুকরো করার চেষ্টা করি ,

vector[0:4,]
[ 0.04965172  0.04979645  0.04994022  0.05008303]
vector[:, np.newaxis][0:4,]
[[ 0.04965172]
[ 0.04979645]
[ 0.04994022]
[ 0.05008303]]

এটি কি একই জিনিস ব্যতীত এটি একটি সারি ভেক্টরকে কলাম ভেক্টরে পরিবর্তন করে?

সাধারণত, এর ব্যবহার কী numpy.newaxisএবং কোন পরিস্থিতিতে আমাদের এটি ব্যবহার করা উচিত?


1
except that it changes a row vector to a column vector? প্রথম উদাহরণটি সারি ভেক্টর নয়। এটি একটি মতলব ধারণা। পাইথনে এটি কেবলমাত্র 1-মাত্রিক ভেক্টর যার কোনও সারি বা কলামের ধারণা নেই। সারি বা কলামের ভেক্টরগুলি 2-ডাইমেনসোনাল, দ্বিতীয় উদাহরণের মতো
এন্ডোলিথ

উত্তর:


327

সহজ কথায়, বিদ্যমান অ্যারের মাত্রা আরও একবার মাত্রা বাড়িয়েnumpy.newaxis ব্যবহার করা হয়, একবার ব্যবহার করা হলে । সুতরাং,

  • 1D অ্যারে 2 ডি অ্যারে হয়ে যাবে

  • 2D অ্যারে হয়ে যাবে 3D অ্যারে

  • 3 ডি অ্যারে 4 ডি অ্যারে হয়ে যাবে

  • 4 ডি অ্যারে 5 ডি অ্যারে হয়ে যাবে

ইত্যাদি

এখানে একটি চিত্তাকর্ষক চিত্রণ যা 2D অ্যারেতে 1D অ্যারে প্রচার করে promotion

newaxis ক্যানভা ভিজ্যুয়ালাইজেশন


পরিস্থিতি -১ : উপরের ছবিতে বর্ণিত হিসাবে np.newaxisআপনি যখন স্পষ্টভাবে কোনও 1 ডি অ্যারেটিকে একটি সারি ভেক্টর বা কলাম ভেক্টরে রূপান্তর করতে চান তখন কার্যকর হতে পারে ।

উদাহরণ:

# 1D array
In [7]: arr = np.arange(4)
In [8]: arr.shape
Out[8]: (4,)

# make it as row vector by inserting an axis along first dimension
In [9]: row_vec = arr[np.newaxis, :]     # arr[None, :]
In [10]: row_vec.shape
Out[10]: (1, 4)

# make it as column vector by inserting an axis along second dimension
In [11]: col_vec = arr[:, np.newaxis]     # arr[:, None]
In [12]: col_vec.shape
Out[12]: (4, 1)

দৃশ্যপট-2 : আমরা ব্যবহার করতে চান, তখন numpy সম্প্রচার যখন করছেন উদাহরণস্বরূপ, কিছু অপারেশন অংশ হিসাবে উপরন্তু কিছু বিন্যাসের।

উদাহরণ:

ধরা যাক আপনি নিম্নলিখিত দুটি অ্যারে যুক্ত করতে চান:

 x1 = np.array([1, 2, 3, 4, 5])
 x2 = np.array([5, 4, 3])

আপনি যদি এটির মতো যুক্ত করার চেষ্টা করেন তবে নম্পপি নিম্নলিখিতগুলি উত্থাপন করবেন ValueError:

ValueError: operands could not be broadcast together with shapes (5,) (3,)

এই পরিস্থিতিতে, আপনি np.newaxisঅ্যারেরগুলির একটিগুলির মাত্রা বাড়াতে ব্যবহার করতে পারেন যাতে নুমপি সম্প্রচার করতে পারে ।

In [2]: x1_new = x1[:, np.newaxis]    # x1[:, None]
# now, the shape of x1_new is (5, 1)
# array([[1],
#        [2],
#        [3],
#        [4],
#        [5]])

এখন, যোগ করুন:

In [3]: x1_new + x2
Out[3]:
array([[ 6,  5,  4],
       [ 7,  6,  5],
       [ 8,  7,  6],
       [ 9,  8,  7],
       [10,  9,  8]])

বিকল্পভাবে, আপনি অ্যারেতে নতুন অক্ষ যুক্ত করতে পারেন x2:

In [6]: x2_new = x2[:, np.newaxis]    # x2[:, None]
In [7]: x2_new     # shape is (3, 1)
Out[7]: 
array([[5],
       [4],
       [3]])

এখন, যোগ করুন:

In [8]: x1 + x2_new
Out[8]: 
array([[ 6,  7,  8,  9, 10],
       [ 5,  6,  7,  8,  9],
       [ 4,  5,  6,  7,  8]])

দ্রষ্টব্য : লক্ষ্য করুন যে আমরা উভয় ক্ষেত্রেই একই ফল পেয়েছি (তবে একটির অপরটির স্থানান্তর হ'ল)।


দৃশ্য -৩ : এটি দৃশ্য -১ এর মতো similar তবে, আপনি উচ্চতর মাত্রায় অ্যারে প্রচার করতে np.newaxisএকাধিকবার ব্যবহার করতে পারেন । উচ্চতর অর্ডার অ্যারেগুলির জন্য ( যেমন টেনার্স ) কখনও কখনও এ জাতীয় একটি অপারেশন প্রয়োজন ।

উদাহরণ:

In [124]: arr = np.arange(5*5).reshape(5,5)

In [125]: arr.shape
Out[125]: (5, 5)

# promoting 2D array to a 5D array
In [126]: arr_5D = arr[np.newaxis, ..., np.newaxis, np.newaxis]    # arr[None, ..., None, None]

In [127]: arr_5D.shape
Out[127]: (1, 5, 5, 1, 1)

Np.newaxis বনাম np.reshape এর আরও পটভূমি

newaxis এটি ছদ্ম-সূচক হিসাবেও ডাকা হয় যা অক্ষকে অবিচ্ছিন্নভাবে একটি মাল্টিয়ারে যুক্ত করতে দেয়।

np.newaxisঅ্যারে পুনঃ যখন slicing অপারেটর ব্যবহার np.reshape(; আর এই হল অভিমানী যে মাত্রা মেলে reshapes আকাঙ্ক্ষিত লেআউটে অ্যারের আবশ্যক একটি জন্য reshapeঘটতে)।

উদাহরণ

In [13]: A = np.ones((3,4,5,6))
In [14]: B = np.ones((4,6))
In [15]: (A + B[:, np.newaxis, :]).shape     # B[:, None, :]
Out[15]: (3, 4, 5, 6)

উপরের উদাহরণে, আমরা প্রথম এবং দ্বিতীয় অক্ষের মধ্যে B(সম্প্রচার ব্যবহার করার জন্য) একটি অস্থায়ী অক্ষ প্রবেশ করিয়ে দিয়েছিলাম। সম্প্রচারের কাজ চালিয়ে np.newaxisযাওয়ার জন্য এখানে একটি অনুপস্থিত অক্ষ পূরণ করা হয়েছে ।


সাধারণ টিপ : আপনি ব্যবহার করতে পারেনNoneস্থানেnp.newaxis; এই আসলে হয় একই বস্তু

In [13]: np.newaxis is None
Out[13]: True

পিএস এছাড়াও এই দুর্দান্ত উত্তরটি দেখুন: নিউজাক্সিস বনাম পুনরায় আকার পরিবর্তন করুন add


3
X1_ নতুন + x2 কী ধরণের অপারেশন? এটি আমার কাছে অদ্ভুত কারণ আমি ভেবেছিলাম যে দুটি ম্যাট্রিক কেবল তখনই যুক্ত করা যেতে পারে যদি তাদের একই মাত্রা থাকে (বা যদি তাদের মধ্যে কোনওটি কেবলমাত্র একটি স্কেলার হয়)।
স্টিফেন

2
@ স্টিফেন যেমনটি আমি উত্তরটিতে উল্লেখ করেছি, এটি নম্পপি সম্প্রচারের কারণে।
কুমারিও 23

2
এটি একটি দুর্দান্ত ব্যাখ্যা
ভ্যালড্রিনিয়াম

2
@ ওয়াল্ড্রিনিট খুশি যে এটি আপনার জন্য সহায়ক :)
কুমারী 23

1
@ কুমারিও ২৩ নিবন্ধটির একেবারে শেষ বাক্যে লুকিয়ে থাকা অবাক করা বিষয়, আশ্চর্যজনকভাবে আমি এটি দেখিনি। আমি এট্রিবিউটর সাথেও এটিকে সীমান্তের চৌর্যবৃত্তি বলে বিবেচনা করি। আমার বইয়ে, শব্দের অনুলিখির জন্য শব্দটি কেবল তখনই গ্রহণযোগ্য যদি তা একই লেখক বিভিন্ন প্ল্যাটফর্মে পোস্ট করে। আমি মাঝারি থেকে ভাল আশা ছিল।
চিরাজ বেনআবেডেলকাদের

29

কী np.newaxis?

np.newaxisশুধু পাইথন ধ্রুবক জন্য একটি alias হয় None, যা যেখানেই থাকুন না কেন আপনি ব্যবহার মানে np.newaxisআপনার কাছে ব্যবহার করতে পারে None:

>>> np.newaxis is None
True

আপনি যদি এর পরিবর্তে ব্যবহার করা কোড পড়েন তবে এটি আরও বর্ণনামূলকnp.newaxisNone

কিভাবে ব্যবহার করবেন np.newaxis?

np.newaxisসাধারণত slicing সঙ্গে ব্যবহার করা হয়। এটি নির্দেশ করে যে আপনি অ্যারেতে অতিরিক্ত মাত্রা যুক্ত করতে চান। np.newaxisযেখানে আমি মাত্রা যুক্ত করতে চাই সেখানে প্রতিনিধিত্ব করার অবস্থান ।

>>> import numpy as np
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a.shape
(10,)

প্রথম উদাহরণে আমি প্রথম মাত্রা থেকে সমস্ত উপাদান ব্যবহার করি এবং একটি দ্বিতীয় মাত্রা যুক্ত করি:

>>> a[:, np.newaxis]
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])
>>> a[:, np.newaxis].shape
(10, 1)

দ্বিতীয় উদাহরণটি প্রথম মাত্রা হিসাবে একটি মাত্রা যুক্ত করে এবং তারপরে ফলাফল অ্যারের দ্বিতীয় মাত্রায় উপাদান হিসাবে মূল অ্যারের প্রথম মাত্রা থেকে সমস্ত উপাদান ব্যবহার করে:

>>> a[np.newaxis, :]  # The output has 2 [] pairs!
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
>>> a[np.newaxis, :].shape
(1, 10)

একইভাবে আপনি np.newaxisএকাধিক মাত্রা যুক্ত করতে একাধিক ব্যবহার করতে পারেন :

>>> a[np.newaxis, :, np.newaxis]  # note the 3 [] pairs in the output
array([[[0],
        [1],
        [2],
        [3],
        [4],
        [5],
        [6],
        [7],
        [8],
        [9]]])
>>> a[np.newaxis, :, np.newaxis].shape
(1, 10, 1)

এর বিকল্প আছে np.newaxisকি?

নম্পপিতে আরও একটি অনুরূপ কার্যকারিতা রয়েছে: np.expand_dimsযা একটি মাত্রা সন্নিবেশ করতেও ব্যবহার করা যেতে পারে:

>>> np.expand_dims(a, 1)  # like a[:, np.newaxis]
>>> np.expand_dims(a, 0)  # like a[np.newaxis, :]

কিন্তু দেওয়া এটি শুধু টিপে 1মধ্যে গুলি shapeআপনার কাছে পারে reshapeএই মাত্রা যোগ করার জন্য অ্যারের:

>>> a.reshape(a.shape + (1,))  # like a[:, np.newaxis]
>>> a.reshape((1,) + a.shape)  # like a[np.newaxis, :]

বেশিরভাগ সময় np.newaxisমাত্রা যুক্ত করার সহজতম উপায়, তবে বিকল্পগুলি জানা ভাল।

কখন ব্যবহার করবেন np.newaxis?

কয়েকটি প্রসঙ্গে দরকারী মাত্রা যুক্ত করা হচ্ছে:

  • যদি ডেটাটির একটি নির্দিষ্ট পরিমাণের মাত্রা থাকা উচিত। উদাহরণস্বরূপ আপনি যদি matplotlib.pyplot.imshow1D অ্যারে প্রদর্শন করতে ব্যবহার করতে চান ।

  • আপনি যদি NumPy চান অ্যারে সম্প্রচার করতে। একটি মাত্রা জোড়ার মাধ্যমে আপনি উদাহরণস্বরূপ এক অ্যারের সব উপাদান মধ্যে পার্থক্য পেতে পারে: a - a[:, np.newaxis]। এই কাজ করে কারণ NumPy অপারেশন শেষ মাত্রা দিয়ে শুরু সম্প্রচার 1

  • একটি প্রয়োজনীয় মাত্রা যুক্ত করতে যাতে NumPy অ্যারে সম্প্রচার করতে পারে । এটি কাজ করে কারণ প্রতিটি দৈর্ঘ্য -1 মাত্রা অন্যান্য অ্যারের সাথে সম্পর্কিত 1 টি মাত্রার দৈর্ঘ্যে কেবল সম্প্রচারিত হয় ।


1 আপনি যদি সম্প্রচারের নিয়মাবলী সম্পর্কে আরও পড়তে চান তবে সেই বিষয়ে নুমপি ডকুমেন্টেশন খুব ভাল good এটি এর সাথে একটি উদাহরণও অন্তর্ভুক্ত করে np.newaxis:

>>> a = np.array([0.0, 10.0, 20.0, 30.0])
>>> b = np.array([1.0, 2.0, 3.0])
>>> a[:, np.newaxis] + b
array([[  1.,   2.,   3.],
       [ 11.,  12.,  13.],
       [ 21.,  22.,  23.],
       [ 31.,  32.,  33.]])

আমি ২ য় এবং তৃতীয় ব্যবহারের ক্ষেত্রে পার্থক্য দেখছি না; তারা উভয়ই NumPy কে কিছু অপারেশনের অংশ হিসাবে অ্যারে সম্প্রচারের অনুমতি দেওয়ার বিষয়ে're যদি তা না হয় তবে পয়েন্টটি স্পষ্ট করতে এটি তৃতীয় ব্যবহারের ক্ষেত্রে উদাহরণ যুক্ত করতে সহায়তা করবে।
চিরাজ বেনআবেডেলকাদের

@ চিরাজবেন অবেলক্যাডার হ্যাঁ, পার্থক্যটি আসলে এতটা আলাদা নয়। আমি নিশ্চিত না যে আমার তৃতীয় পয়েন্টটি মুছে ফেলা উচিত বা এটি দ্বিতীয়টিতে একীভূত করা উচিত।
এমসিফার্ট

9

আপনি সংখ্যার এক-মাত্রিক তালিকা দিয়ে শুরু করেছেন। একবার আপনি ব্যবহার করার পরে numpy.newaxis, আপনি একে দ্বিমাত্রিক ম্যাট্রিক্সে পরিণত করেছেন, প্রতিটি কলামের চারটি সারি নিয়ে।

তারপরে আপনি সেই ম্যাট্রিক্সটি ম্যাট্রিক্সের গুণণের জন্য ব্যবহার করতে পারেন বা এটি আরও বড় 4 এক্সএন ম্যাট্রিক্স নির্মাণে জড়িত থাকতে পারেন।


5

newaxisনির্বাচনের টুপলেতে অবজেক্টটি এক ইউনিটের দৈর্ঘ্যের মাত্রার দ্বারা ফলাফলের নির্বাচনের মাত্রাগুলি প্রসারিত করে

এটি কেবল সারি ম্যাট্রিক্সকে কলাম ম্যাট্রিক্সে রূপান্তর নয়।

নীচের উদাহরণ বিবেচনা করুন:

In [1]:x1 = np.arange(1,10).reshape(3,3)
       print(x1)
Out[1]: array([[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]])

এখন আসুন আমাদের ডেটাতে নতুন মাত্রা যুক্ত করুন,

In [2]:x1_new = x1[:,np.newaxis]
       print(x1_new)
Out[2]:array([[[1, 2, 3]],

              [[4, 5, 6]],

              [[7, 8, 9]]])

আপনি দেখতে পাচ্ছেন যে newaxisএখানে অতিরিক্ত মাত্রা যুক্ত হয়েছে, x1 এর মাত্রা ছিল (3,3) এবং এক্স 1_র নতুন মাত্রা রয়েছে (3,1,3)।

আমাদের নতুন মাত্রা কীভাবে আমাদেরকে বিভিন্ন ক্রিয়াকলাপে সক্ষম করে:

In [3]:x2 = np.arange(11,20).reshape(3,3)
       print(x2)
Out[3]:array([[11, 12, 13],
              [14, 15, 16],
              [17, 18, 19]]) 

এক্স 1_ নতুন এবং এক্স 2 যুক্ত করা, আমরা পাই:

In [4]:x1_new+x2
Out[4]:array([[[12, 14, 16],
               [15, 17, 19],
               [18, 20, 22]],

              [[15, 17, 19],
               [18, 20, 22],
               [21, 23, 25]],

              [[18, 20, 22],
               [21, 23, 25],
               [24, 26, 28]]])

সুতরাং, newaxisকলাম ম্যাট্রিক্সে সারি রূপান্তর নয়। এটি ম্যাট্রিক্সের মাত্রা বাড়িয়ে তোলে, এভাবে আমাদের এটির উপর আরও বেশি কাজ করতে সক্ষম করে।


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