निम्नलिखित उदाहरण पर विचार करें:

>>> a=np.array([1,2,3,4])
>>> a
array([1, 2, 3, 4])
>>> a[np.newaxis,:,np.newaxis]
array([[[1],
        [2],
        [3],
        [4]]])

अल्पविराम से अलग किए गए सबस्क्रिप्टिंग का उपयोग करते समय Numpy के लिए : (आमतौर पर स्लाइसिंग एरेज़ के लिए उपयोग किया जाता है) को इंडेक्स के रूप में उपयोग करना कैसे संभव है?

यदि मैं अल्पविराम से अलग किए गए सबस्क्रिप्टिंग को पायथन सूची या पायथन सूची-सूची के साथ उपयोग करने का प्रयास करता हूं, तो मुझे एक TypeError मिलता है:

>>> [[1,2],[3,4]][0,:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not tuple

?

0
Shuzheng 28 अक्टूबर 2020, 18:20

2 जवाब

सबसे बढ़िया उत्तर

एक getitem, अनुक्रमण विधि के साथ एक साधारण वर्ग को परिभाषित करें:

In [128]: class Foo():
     ...:     def __getitem__(self, arg):
     ...:         print(type(arg), arg)
     ...: 
In [129]: f = Foo()

और देखें कि विभिन्न सूचकांक क्या उत्पन्न करते हैं:

In [130]: f[:]
<class 'slice'> slice(None, None, None)
In [131]: f[1:2:3]
<class 'slice'> slice(1, 2, 3)
In [132]: f[:, [1,2,3]]
<class 'tuple'> (slice(None, None, None), [1, 2, 3])
In [133]: f[:, :3]
<class 'tuple'> (slice(None, None, None), slice(None, 3, None))
In [134]: f[(slice(1,None),3)]
<class 'tuple'> (slice(1, None, None), 3)

list जैसी बिल्टिन कक्षाओं के लिए, एक टपल तर्क एक त्रुटि उत्पन्न करता है। लेकिन यह एक वर्ग निर्भर मुद्दा है, वाक्यविन्यास नहीं। numpy.ndarray टपल को तब तक स्वीकार करता है, जब तक कि वह अपने आकार के अनुकूल हो।

टपल इंडेक्स के सिंटैक्स को numpy की जरूरतों को पूरा करने के लिए पायथन में जोड़ा गया था। मुझे नहीं लगता कि इसका उपयोग करने वाले कोई भी बिल्टिन वर्ग हैं।

numpy.lib.index_tricks.py मॉड्यूल में कई वर्ग हैं जो इस व्यवहार का लाभ उठाते हैं। अधिक विचारों के लिए इसका कोड देखें।

In [137]: np.s_[3:]
Out[137]: slice(3, None, None)
In [139]: np.r_['0,2,1',[1,2,3],[4,5,6]]
Out[139]: 
array([[1, 2, 3],
       [4, 5, 6]])
In [140]: np.c_[[1,2,3],[4,5,6]]
Out[140]: 
array([[1, 4],
       [2, 5],
       [3, 6]])

अन्य "अनुक्रमण" उदाहरण:

In [141]: f[...]
<class 'ellipsis'> Ellipsis
In [142]: f[[1,2,3]]
<class 'list'> [1, 2, 3]
In [143]: f[10]
<class 'int'> 10
In [144]: f[{1:12}]
<class 'dict'> {1: 12}

मैं किसी भी वर्ग के बारे में नहीं जानता जो एक ताना तर्क का उपयोग करता है, लेकिन वाक्यविन्यास इसे अनुमति देता है।

1
hpaulj 29 अक्टूबर 2020, 23:26

सूचियां 1डी हैं और आप या तो एक इंडेक्स या एक स्लाइस पास कर सकते हैं। : जब अनुक्रमणिका के लिए उपयोग किया जाता है तो एक टुकड़ा बनाने के लिए एक छोटा संकेतन होता है। [[1,2],[3,4]][0,:] में आप 0,: पास कर रहे हैं, जो कि टपल (0, :) है। यही है, टपल बनाने के लिए यहां कोष्ठक वैकल्पिक हैं। केवल अल्पविराम द्वारा अलग किए गए मान होने से टपल बन जाएगा।

लेकिन numpy अलग है, क्योंकि यह एक N-आयामी सरणी है, न कि केवल 1D सूचियों के रूप में आप विभिन्न आयामों को अनुक्रमित करने के लिए एकाधिक अनुक्रमणिका पास कर सकते हैं। इसलिए, जब तक टपल में तत्वों की संख्या अनुक्रमित सरणी के आयामों से अधिक न हो, तब तक टपल को इंडेक्स numpy में पास करने की अनुमति है। नीचे दिए गए सरणी पर विचार करें

arr = np.random.randn(5,10, 3)  

इसके 3 आयाम हैं और हम इसे arr[0,1,0] की तरह अनुक्रमित कर सकते हैं, लेकिन यह arr[(0,1,0)] जैसा ही है। यही है, हम सरणी को अनुक्रमित करने के लिए एक टपल पास कर रहे हैं। प्रत्येक टपल तत्व स्वयं एक पूर्णांक या एक टुकड़ा हो सकता है और numpy विनियोजित अनुक्रमण करेगा। Numpy अनुक्रमण के लिए टुपल्स को स्वीकार करता है, लेकिन सूचियाँ नहीं।

हालांकि, जब आप a[np.newaxis,:,np.newaxis] लिखते हैं तो यह सिर्फ अनुक्रमण से कहीं अधिक होता है। सबसे पहले, ध्यान दें कि np.newaxis सिर्फ कोई नहीं है। जब आप किसी आयाम को सुन्न में अनुक्रमित करने के लिए कोई नहीं का उपयोग करते हैं तो वह उस आयाम को बनाने के रूप में क्या करता है। आपके उदाहरण में a सरणी 1D है, लेकिन a[np.newaxis,:,np.newaxis] एक विशेष प्रकार की अनुक्रमणिका है जिसे numpy द्वारा एक संक्षिप्त संकेतन के रूप में समझा जाता है "मुझे अतिरिक्त अक्ष के साथ एक सरणी दें जहां मैं np.newaxis के साथ अनुक्रमणित कर रहा हूं और जिनके तत्व मेरे मूल सरणी से अनुक्रमित हैं जैसा कि मैं निर्दिष्ट कर रहा हूं"।

तो, TLDR का उत्तर है सुन्न अनुक्रमण सूची अनुक्रमण की तुलना में अधिक सामान्य और शक्तिशाली है।

0
darcamo 28 अक्टूबर 2020, 18:51