Numpy.newaxis कैसे काम करता है और इसका उपयोग कब करना है?


185

जब मैं कोशिश करता हूं

numpy.newaxis

परिणाम मुझे 0 से 1. एक्स-अक्ष के साथ 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? पहला उदाहरण पंक्ति वेक्टर नहीं है। यह एक matlab अवधारणा है। अजगर में यह केवल 1-आयामी वेक्टर है जिसमें कोई पंक्ति या स्तंभ अवधारणा नहीं है। पंक्ति या स्तंभ वेक्टर 2-
डिमेन्सोनल

जवाबों:


327

सीधे शब्दों में कहें, numpy.newaxisकरने के लिए प्रयोग किया जाता है आयाम में वृद्धि से मौजूदा सरणी के एक और आयाम जब इस्तेमाल किया, एक बार । इस प्रकार,

  • 1 डी सरणी 2 डी सरणी बन जाएगी

  • 2D सरणी 3D सरणी बन जाएगी

  • 3D सरणी 4D सरणी बन जाएगी

  • 4D सरणी 5D सरणी बन जाएगी

और इसी तरह..

यहाँ एक दृश्य चित्रण है जिसमें 1 डी सरणी को 2 डी सरणियों के प्रचार को दर्शाया गया है ।

newaxis canva विज़ुअलाइज़ेशन


परिदृश्य -1 : np.newaxisतब काम में आ सकता है जब आप स्पष्ट रूप से 1D सरणी को पंक्ति वेक्टर या कॉलम वेक्टर में बदलना चाहते हैं , जैसा कि ऊपर चित्र में दिखाया गया है।

उदाहरण:

# 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])

यदि आप इन्हें ऐसे ही जोड़ने का प्रयास करते हैं, तो NumPy निम्नलिखित को बढ़ाएगा ValueError:

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

इस स्थिति में, आप np.newaxisकिसी एक सरणियों के आयाम को बढ़ाने के लिए उपयोग कर सकते हैं ताकि NumPy प्रसारण कर सके ।

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]])

नोट : निरीक्षण करें कि हम दोनों मामलों में एक ही परिणाम प्राप्त करते हैं (लेकिन एक दूसरे का संक्रमण हो रहा है)।


परिदृश्य -3 : यह परिदृश्य -1 के समान है। लेकिन, आप सरणी को उच्च आयामों में बढ़ावा देने के 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सरणी से बनाना, जबकि टुकड़ा करने की क्रिया ऑपरेटर का उपयोग करता है np.reshape(; और यह है यह सोचते हैं कि आकार-प्रकार के नया स्वरूप दे इच्छित लेआउट करने के लिए सरणी चाहिए एक के लिए 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

पुनश्च यह भी महान जवाब देखें: newaxis बनाम आयाम जोड़ने के लिए नयी आकृति प्रदान करें


3
X1_new + x2 किस प्रकार का ऑपरेशन है? यह मेरे लिए अजीब है क्योंकि मुझे लगा कि दो मैट्रिक्स केवल तभी जोड़े जा सकते हैं जब उनके समान आयाम हों (या यदि उनमें से एक वास्तव में सिर्फ एक स्केलर है)।
स्टीफन

2
@Stephen जैसा कि मैंने भी उत्तर में उल्लेख किया है, यह NumPy ब्रॉडकास्टिंग के कारण है।
kmario23

2
यह एक भयानक
व्याख्या है

2
@valdrinit को खुशी है कि यह आपके लिए उपयोगी है :)
kmario23

1
@ kmario23 वास्तव में लेख के बहुत ही अंतिम वाक्य में अट्रैक्शन छिपा हुआ है, कोई आश्चर्य नहीं कि मैंने इसे नहीं देखा। मैं इसे इस विशेषता के साथ सीमा-संबंधी साहित्यिक चोरी भी मानता हूं। मेरी पुस्तक में, शब्द की नकल के लिए शब्द केवल स्वीकार्य है यदि यह एक ही लेखक को विभिन्न प्लेटफार्मों पर पोस्ट कर रहा है। मुझे मीडियम से बेहतर की उम्मीद थी।
चिराज़ बेनअबेल्डाकर

29

क्या है np.newaxis?

np.newaxisसिर्फ अजगर निरंतर के लिए एक उपनाम है None, जो भी आप का उपयोग करने वाले साधन np.newaxisआप भी इस्तेमाल कर सकते हैं None:

>>> np.newaxis is None
True

यदि आप इसके बजाय कोड का उपयोग करते हैं तो यह अधिक वर्णनात्मकnp.newaxis है None

कैसे करें इस्तेमाल np.newaxis?

np.newaxisआम तौर पर टुकड़ा करने की क्रिया के साथ प्रयोग किया जाता है। यह इंगित करता है कि आप सरणी में एक अतिरिक्त आयाम जोड़ना चाहते हैं। 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 ?

NumPy में एक और समान कार्यक्षमता है: np.expand_dimsजिसका उपयोग एक आयाम डालने के लिए भी किया जा सकता है:

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

लेकिन यह देखते हुए कि यह आपको इन आयामों को जोड़ने के लिए सरणी 1में सम्मिलित करता है :shapereshape

>>> 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 यदि आप प्रसारण नियमों के बारे में अधिक पढ़ना चाहते हैं तो उस विषय पर NumPy प्रलेखन बहुत अच्छा है। इसके साथ एक उदाहरण भी शामिल है 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 की अनुमति देने के बारे में हैं। यदि नहीं, तो यह बिंदु को स्पष्ट करने के लिए तीसरे उपयोग के मामले के लिए एक उदाहरण जोड़ने में मदद करेगा।
चिराज़ बेनअबेल्डाकर

@ChirazBenAbdelkader हाँ, भेद वास्तव में उतना अलग नहीं है। मुझे यकीन नहीं है कि मुझे तीसरे बिंदु को हटा देना चाहिए या इसे दूसरे में विलय करना चाहिए।
MSeifert

9

आपने संख्याओं की एक-आयामी सूची के साथ शुरुआत की। एक बार जब आप उपयोग करते हैं numpy.newaxis, तो आप इसे दो-आयामी मैट्रिक्स में बदल देते हैं, जिसमें एक स्तंभ की चार पंक्तियाँ होती हैं।

तब आप मैट्रिक्स गुणा के लिए उस मैट्रिक्स का उपयोग कर सकते थे, या इसे बड़े 4 xn मैट्रिक्स के निर्माण में शामिल कर सकते थे।


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) और X1_new का आयाम (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]]) 

X1_new और x2 को जोड़ने पर, हमें यह मिलता है:

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
यह सिर्फ मैट्रिक्स नहीं है, यह ndarrayNumPy शब्दावली में किसी के साथ काम करता है ।
kmario23
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.