2015-01-17 6 views
9

क्या, यदि कोई है, तो NumPy "संरचित सरणी", "रिकॉर्ड सरणी" और "पुनरावृत्ति" के बीच अंतर क्या है?NumPy "रिकॉर्ड सरणी" या "संरचित सरणी" या "पुनरावृत्ति"

NumPy docs का अर्थ है कि पहले दो समान हैं: यदि वे हैं, तो इस वस्तु के लिए पसंदीदा शब्द कौन सा है?

एक ही प्रलेखन (पृष्ठ के निचले हिस्से में) कहता है: आप रिकॉर्ड्स और संरचित सरणी (दोनों के बीच अंतर सहित) here पर कुछ और जानकारी पा सकते हैं। क्या इस अंतर का एक सरल स्पष्टीकरण है?

+0

[संरचित सरणी (उर्फ "रिकॉर्ड सरणी")] (http://docs.scipy.org/doc/numpy/user/basics.rec.html) –

+0

मैंने सवाल स्पष्ट किया है, @ अश्विनी चौधरी - धन्यवाद । – xnx

+0

दस्तावेज़ों पर अंतर के स्पष्टीकरण के बारे में क्या अस्पष्ट है? recarray 'arr.foo' रूप में फ़ील्ड तक पहुंच का समर्थन करता है, जबकि सामान्य संरचित सरणी केवल 'arr [' foo ']' प्रारूप के माध्यम से पहुंच का समर्थन करती हैं, लेकिन यह देखने के लिए तेज़ है। मैं कभी भी "संरचित सरणी" "रिकॉर्ड एरे" नहीं कहूंगा, ठीक है क्योंकि यह "रिकर्अर्स" के साथ इतना संभावित भ्रम पैदा करता है। – zehnpaard

उत्तर

7

रिकॉर्ड्स/recarrays इस फाइल

रिकार्ड सरणी रिकार्ड सरणियों गुण के रूप में संरचित सरणियों के क्षेत्र का पर्दाफाश से

https://github.com/numpy/numpy/blob/master/numpy/core/records.py

कुछ प्रासंगिक उद्धरण में लागू किया जाता है। पुनरावृत्ति एक मानक सरणी के लगभग समान है (जो पहले से ही फ़ील्ड नामित है) सबसे बड़ा अंतर यह है कि यह विशेषता-फ़ील्ड का उपयोग फ़ील्ड खोजने के लिए कर सकता है और इसे रिकॉर्ड का उपयोग करके बनाया गया है।

recarrayndarray का एक उपवर्ग (उसी तरह matrix और masked arrays हैं कि में) है। लेकिन ध्यान दें कि यह कन्स्ट्रक्टर np.array से अलग है। यह np.empty(size, dtype) की तरह है।

class recarray(ndarray): 
    """Construct an ndarray that allows field access using attributes. 
    This constructor can be compared to ``empty``: it creates a new record 
     array but does not fill it with data. 

विशेषता व्यवहार के रूप में अद्वितीय क्षेत्र लागू करने के लिए मुख्य कार्य __getattribute__ है (__getitem__ लागू करता अनुक्रमण):

def __getattribute__(self, attr): 
    # See if ndarray has this attr, and return it if so. (note that this 
    # means a field with the same name as an ndarray attr cannot be 
    # accessed by attribute). 
    try: 
     return object.__getattribute__(self, attr) 
    except AttributeError: # attr must be a fieldname 
     pass 

    # look for a field with this name 
    fielddict = ndarray.__getattribute__(self, 'dtype').fields 
    try: 
     res = fielddict[attr][:2] 
    except (TypeError, KeyError): 
     raise AttributeError("recarray has no attribute %s" % attr) 
    obj = self.getfield(*res) 

    # At this point obj will always be a recarray, since (see 
    # PyArray_GetField) the type of obj is inherited. Next, if obj.dtype is 
    # non-structured, convert it to an ndarray. If obj is structured leave 
    # it as a recarray, but make sure to convert to the same dtype.type (eg 
    # to preserve numpy.record type if present), since nested structured 
    # fields do not inherit type. 
    if obj.dtype.fields: 
     return obj.view(dtype=(self.dtype.type, obj.dtype.fields)) 
    else: 
     return obj.view(ndarray) 

यह पहली बार यह एक नियमित विशेषता पाने के लिए कोशिश करता है - .shape तरह बातें, .strides, .data , साथ ही सभी विधियों (.sum, .reshape, आदि)। यह विफल होने के बाद dtype फ़ील्ड नामों में नाम दिखता है। तो यह वास्तव में कुछ परिभाषित एक्सेस विधियों के साथ एक संरचित सरणी है।

सबसे अच्छा मैं record array और recarray बता सकता हूं।

एक और फ़ाइल इतिहास उपयोगिताओं के

https://github.com/numpy/numpy/blob/master/numpy/lib/recfunctions.py

संग्रह के बारे में कुछ संरचित सरणियों हेरफेर करने के लिए पता चलता है। इनमें से अधिकतर कार्यों को शुरुआत में जॉन हंटर द्वारा matplotlib के लिए कार्यान्वित किया गया था। उन्हें सुविधा के लिए फिर से लिखा और विस्तारित किया गया है।

इस फ़ाइल में कार्यों में से कई के साथ समाप्त:

if asrecarray: 
     output = output.view(recarray) 

तथ्य यह है कि आप एक सरणी लौट सकते हैं के रूप में recarray देखने से पता चलता है कि कैसे 'पतली' इस परत है।

numpy का एक लंबा इतिहास है, और कई स्वतंत्र परियोजनाओं को विलय करता है। मेरी धारणा यह है कि recarray एक पुराना विचार है, और संरचित सरणी वर्तमान कार्यान्वयन जो सामान्यीकृत dtype पर बनाया गया है। recarrays किसी भी नए विकास की तुलना में सुविधा और पिछड़े संगतता के लिए रखा जाना प्रतीत होता है। लेकिन मुझे github फ़ाइल इतिहास का अध्ययन करना होगा, और किसी भी हालिया मुद्दे/पुल अनुरोध सुनिश्चित करने के लिए होगा।

संबंधित मुद्दे