Numpy के अरै (और) और ऐरे () कार्यों के बीच क्या अंतर है?


297

Numpy array()और asarray()कार्यों के बीच क्या अंतर है? आपको एक के बजाय एक का उपयोग कब करना चाहिए? वे उन सभी इनपुटों के लिए समान आउटपुट उत्पन्न करते हैं, जिनके बारे में मैं सोच सकता हूं।

जवाबों:


110

के बाद से अन्य प्रश्न यह एक जो के बारे में पूछने पर पुनः निर्देशित किया जा रहा है asanyarrayया अन्य सरणी निर्माण दिनचर्या , यह शायद उनमें से प्रत्येक क्या करता है का एक संक्षिप्त सारांश बनाना उचित है।

अंतर मुख्य रूप से इनपुट को वापस लाने के बारे में है, जब कॉपी के रूप में एक नया सरणी बनाने का विरोध किया जाता है।

arrayविकल्पों की एक विस्तृत विविधता प्रदान करता है (अन्य कार्यों में से अधिकांश इसके चारों ओर पतले रैपर हैं), जब कॉपी करने के लिए निर्धारित करने के लिए झंडे सहित। एक पूर्ण विवरण डॉक्स के रूप में लंबे समय तक ले जाएगा ( ऐरे क्रिएशन देखें , लेकिन संक्षेप में, यहां कुछ उदाहरण हैं:

मान लें aकि एक है ndarray, और mएक है matrix, और वे दोनों में से एक dtypeहै float32:

  • np.array(a)और np.array(m)दोनों को कॉपी करेगा, क्योंकि यह डिफ़ॉल्ट व्यवहार है।
  • np.array(a, copy=False)और np.array(m, copy=False)कॉपी करेगा mलेकिन नहीं a, क्योंकि mए नहीं है ndarray
  • np.array(a, copy=False, subok=True)और np.array(m, copy=False, subok=True)न तो नकल करेगा, क्योंकि mएक है matrix, जो एक उपवर्ग है ndarray
  • np.array(a, dtype=int, copy=False, subok=True)दोनों की नकल करेगा, क्योंकि dtypeसंगत नहीं है।

arrayजब नकल होती है तो उस नियंत्रण के आसपास अन्य कार्यों में से अधिकांश पतली आवरण होते हैं :

  • asarray: यदि यह एक संगत ndarray( copy=False) है तो इनपुट को बिना लाइसेंस के वापस लौटा दिया जाएगा ।
  • asanyarray: यदि यह एक संगत ndarrayया उपवर्ग matrix( जैसे copy=False, subok=True) है , तो इनपुट को बिना लाइसेंस के वापस लौटा दिया जाएगा ।
  • ascontiguousarray: इनपुट uncopied लौटा दी जाएगी iff यह एक संगत है ndarrayसन्निहित सी क्रम में ( copy=False, order='C')
  • asfortranarray: यदि यह ndarrayसन्निहित फोरट्रान ऑर्डर ( copy=False? order='F') में एक संगत है , तो इनपुट को बंद नहीं किया जाएगा ।
  • require: यदि इनपुट निर्दिष्ट आवश्यकताओं स्ट्रिंग के साथ संगत है तो इनपुट को बिना लाइसेंस के वापस कर दिया जाएगा।
  • copy: इनपुट हमेशा कॉपी किया जाता है।
  • fromiter: इनपुट को एक पुनरावृत्त के रूप में माना जाता है (इसलिए, जैसे, आप इट्रेटर के तत्वों से एक सरणी का निर्माण कर सकते हैं, बजाय इटरेटर के एक objectसरणी के साथ); हमेशा कॉपी किया गया।

सुविधा कार्य भी हैं, जैसे asarray_chkfinite(समान नियम कॉपी करना asarray, लेकिन ValueErrorयदि कोई मान nanया infमान हो तो), और उपवर्गों के लिए matrixया विशेष मामलों जैसे रिकॉर्ड सरणियों के लिए, और निश्चित रूप से वास्तविक ndarrayकंस्ट्रक्टर (जो आपको एक सरणी बनाने देता है) बफर के ऊपर से बाहर)।


इसके लिए धन्यवाद, यह बहुत उपयोगी है
क्रिश

234

की परिभाषाasarray है:

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)

तो यह पसंद है array, सिवाय इसके कम विकल्प हैं, और copy=Falsearrayहै copy=Trueडिफ़ॉल्ट रूप से।

मुख्य अंतर यह है कि array(डिफ़ॉल्ट रूप से) ऑब्जेक्ट की एक प्रतिलिपि asarrayबनाएगा , जबकि आवश्यक नहीं होगा।


13
तो हमें प्रत्येक का उपयोग कब करना चाहिए? यदि खरोंच से एक सरणी बना रहा है, जो बेहतर है, array([1, 2, 3])या asarray([1, 2, 3])?
एंडोलिथ

15
@endolith: [1, 2, 3]एक पायथन सूची है, इसलिए डेटा की एक प्रतिलिपि बनाने के लिए आवश्यक है ndarary। इसलिए np.arrayइसके बजाय सीधे उपयोग करें np.asarrayजिससे copy=Falseपैरामीटर को भेजा जाएगा np.arraycopy=Falseयदि एक प्रति के रूप में यह इस मामले में हो सकता है किया जाना चाहिए नजरअंदाज कर दिया है। यदि आप %timeitIPython में दो बेंचमार्क का उपयोग करते हैं , तो आपको छोटी सूचियों के लिए अंतर दिखाई देगा, लेकिन यह शायद ही मायने रखता है जो आप बड़ी सूचियों के लिए उपयोग करते हैं।
अनुतु

3
यह विधि के नाम के अनुसार भी समझ में आता है: "ऐरेयर": इसे एक सरणी (inplace) के रूप में समझें, अर्थात, आप इस सूची / सरणी पर अपना दृष्टिकोण बदलने की तरह हैं। "ऐरे": वास्तव में इसे एक नए एरे में परिवर्तित करें।

1
कैसे के बारे में np.asanyarray?
ली

3
@Lee: asarrayहमेशा एक रिटर्न ndarray। अगर यह है कि क्या यह पारित किया गया था asanyarrayकी एक उपवर्ग वापस आ जाएगी ndarray। उदाहरण के लिए, np.matrixएक उप का एक उपवर्ग है ndarray। तो np.asanyarray(np.matrix(...))वही मैट्रिक्स लौटाता है, जबकि np.asarray(np.matrix(...))मैट्रिक्स को एक में परिवर्तित करता है ndarray
अनटुब

113

अंतर को इस उदाहरण द्वारा प्रदर्शित किया जा सकता है:

  1. एक मैट्रिक्स उत्पन्न करें

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  2. numpy.arrayसंशोधित करने के लिए उपयोग करें A। काम नहीं करता क्योंकि आप एक प्रति संशोधित कर रहे हैं

    >>> numpy.array(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  3. numpy.asarrayसंशोधित करने के लिए उपयोग करें A। यह काम किया क्योंकि आप Aखुद को संशोधित कर रहे हैं

    >>> numpy.asarray(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 2.,  2.,  2.]])

उम्मीद है की यह मदद करेगा!


13

मतभेदों के दस्तावेज में काफी स्पष्ट रूप से उल्लेख कर रहे हैं arrayऔर asarray। मतभेद तर्क सूची में निहित हैं और इसलिए उन मापदंडों के आधार पर फ़ंक्शन की कार्रवाई।

फ़ंक्शन परिभाषाएँ हैं:

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

तथा

numpy.asarray(a, dtype=None, order=None)

निम्नलिखित तर्क वे हैं जिन्हें दस्तावेज़ में उल्लिखित किया जा सकता है arrayऔर नहीं भी asarray :

प्रतिलिपि: बूल, वैकल्पिक यदि सत्य (डिफ़ॉल्ट) है, तो ऑब्जेक्ट की प्रतिलिपि बनाई गई है । अन्यथा, एक प्रति केवल तभी बनाई जाएगी जब __array__कोई प्रति लौटाता है, यदि obj एक नेस्टेड अनुक्रम है, या यदि किसी अन्य आवश्यकताओं (dtype, आदेश, आदि) को संतुष्ट करने के लिए एक प्रति की आवश्यकता है।

सबोक: बूल, वैकल्पिक यदि सही है, तो उप-कक्षाएं पास-थ्रू हो जाएंगी , अन्यथा लौटे सरणी को बेस-क्लास सरणी (डिफ़ॉल्ट) होने के लिए मजबूर किया जाएगा।

ndmin: int, ऐच्छिक न्यूनतम आयामों की न्यूनतम संख्या निर्दिष्ट करता है जिसके परिणामस्वरूप सरणी होनी चाहिए। इस आवश्यकता को पूरा करने के लिए ओनों को पहले से आकार दिया जाएगा।


1

यहाँ एक सरल उदाहरण है जो अंतर प्रदर्शित कर सकता है।

मुख्य अंतर यह है कि सरणी मूल डेटा की एक प्रतिलिपि बनाएगी और विभिन्न ऑब्जेक्ट का उपयोग करके हम मूल सरणी में डेटा को संशोधित कर सकते हैं।

import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)

सरणी (ए) की सामग्री, अछूती रहती है, और फिर भी, हम मूल सरणी में सामग्री को संशोधित किए बिना किसी अन्य ऑब्जेक्ट का उपयोग करके डेटा पर कोई भी ऑपरेशन कर सकते हैं।


0

asarray(x) के समान ही array(x, copy=False)

का प्रयोग करें asarray(x)जब आप यह सुनिश्चित करें कि चाहते हैं xएक सरणी हो जाएगा से पहले किसी भी अन्य कार्यों किया जाता है। यदि xपहले से ही एक सरणी है तो कोई भी नकल नहीं की जाएगी। यह एक निरर्थक प्रदर्शन हिट का कारण नहीं होगा।

यहां एक फ़ंक्शन का एक उदाहरण है जो यह सुनिश्चित करता है कि xपहले एक सरणी में परिवर्तित हो जाए।

def mysum(x):
    return np.asarray(x).sum()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.