सुन्न में चपटा और बेड़ा कार्यों के बीच अंतर क्या है?


292
import numpy as np
y = np.array(((1,2,3),(4,5,6),(7,8,9)))
OUTPUT:
print(y.flatten())
[1   2   3   4   5   6   7   8   9]
print(y.ravel())
[1   2   3   4   5   6   7   8   9]

दोनों फ़ंक्शन समान सूची को लौटाते हैं। फिर एक ही काम करने वाले दो अलग-अलग कार्यों की आवश्यकता क्या है।


14
Ravel आमतौर पर मौजूदा सरणी में एक दृश्य लौटाता है (कभी-कभी यह प्रतिलिपि देता है)। सपाट एक नया सरणी देता है।
एलेक्स


1
यहाँ सूक्ष्म अंतर का व्यावहारिक प्रदर्शन है।
प्रोस्टि

तो क्या कोई उदाहरण दे सकता है कि किसी सरणी को समतल करना बेहतर है और उसे कब उभारना है?
अलेक्जेंडर

जवाबों:


371

वर्तमान एपीआई यह है कि:

  • flatten हमेशा एक प्रति लौटाता है।
  • ravelजब भी संभव हो मूल सरणी का दृश्य लौटाता है। यह मुद्रित आउटपुट में दिखाई नहीं देता है, लेकिन यदि आप ravel द्वारा लौटाए गए सरणी को संशोधित करते हैं, तो यह मूल सरणी में प्रविष्टियों को संशोधित कर सकता है। यदि आप समतल से लौटी सरणी में प्रविष्टियों को संशोधित करते हैं तो ऐसा कभी नहीं होगा। कोई मेमोरी कॉपी न किए जाने के बाद से रवेल अक्सर तेज़ हो जाएगा, लेकिन आपको उस सरणी को संशोधित करने के बारे में अधिक सावधान रहना होगा।
  • reshape((-1,)) जब भी एरे के तार इसे अनुमति देते हैं तब भी एक दृश्य मिलता है, भले ही इसका मतलब है कि आपको हमेशा एक सन्निहित सरणी नहीं मिलती है।

30
किसी भी विचार क्यों NumPy डेवलपर्स कुछ पैरामीटर कॉपी = [सच, गलत] के साथ एक फ़ंक्शन से चिपके नहीं थे?
फ्रेंक डर्नोनकोर्ट

41
Backcompat गारंटी कभी-कभी इस तरह की अजीब बातें होती है। उदाहरण के लिए: हाल ही में सुन्न डेवलपर्स (1.10 में) ने एक पूर्व निहित गारंटी को जोड़ा कि ravel एक सन्निकट सरणी (C एक्सटेंशन लिखते समय एक संपत्ति जो बहुत महत्वपूर्ण है) लौटाएगा, इसलिए अब एपीआई से बचने के a.flatten()लिए सुनिश्चित करने के लिए एक प्रति प्राप्त करना है a.ravel()अधिकांश प्रतियाँ, लेकिन फिर भी गारंटी देती हैं कि वापस लौटाया गया सरणी सन्निहित है, और a.reshape((-1,))वास्तव में एक दृश्य प्राप्त करने के लिए जब भी सरणी के तार इसे अनुमति देते हैं, भले ही इसका मतलब है कि आपको हमेशा एक सन्निहित सरणी नहीं मिलती है।
इन्नह

4
@ होसेन इयान ने इसे समझाया: ravelएक सन्निहित सरणी की गारंटी देता है, और इसलिए यह गारंटी नहीं है कि यह एक दृश्य लौटाता है; reshapeहमेशा एक दृश्य देता है, और इसलिए यह गारंटी नहीं है कि यह एक सन्निहित सरणी देता है।
iled

4
@Hossein यह एक नया प्रश्न होगा। बहुत संक्षेप में, एक सन्निहित स्मृति स्थान को पढ़ना और लिखना बहुत तेज़ है। एसओ ( अच्छा उदाहरण यहां ) पर उस पर कई सवाल और जवाब हैं , अगर आपको कोई और प्रश्न पूछना है तो एक नया खोलने के लिए स्वतंत्र महसूस करें।
20

2
reshape(-1)के बराबर हैreshape((-1,))
टॉम पॉहल

53

जैसा कि यहां बताया गया है कि एक महत्वपूर्ण अंतर यह है:

  • flatten ndarray ऑब्जेक्ट की एक विधि है और इसलिए इसे केवल सही सुन्न सरणियों के लिए कहा जा सकता है।

  • ravel एक पुस्तकालय-स्तर का कार्य है और इसलिए किसी भी वस्तु पर कॉल किया जा सकता है जिसे सफलतापूर्वक पार्स किया जा सकता है।

उदाहरण के लिए ravelndarrays की सूची पर काम करेंगे, जबकि flattenउस प्रकार की वस्तु के लिए उपलब्ध नहीं है।

@ इयान अपने जवाब में मेमोरी हैंडलिंग के साथ महत्वपूर्ण अंतर भी बताते हैं।


4
ravel के बारे में जानकारी के लिए thx () ndarray's
javadba

न केवल सरणियों की सूची बल्कि सूचियों की सूची भी :)
टाइम्टोडी

15

यहाँ कार्यों के लिए सही नामस्थान है:

दोनों फ़ंक्शन नई मेमोरी संरचनाओं की ओर इशारा करते हुए 1D सरणियों को समतल करते हैं।

import numpy
a = numpy.array([[1,2],[3,4]])

r = numpy.ravel(a)
f = numpy.ndarray.flatten(a)  

print(id(a))
print(id(r))
print(id(f))

print(r)
print(f)

print("\nbase r:", r.base)
print("\nbase f:", f.base)

---returns---
140541099429760
140541099471056
140541099473216

[1 2 3 4]
[1 2 3 4]

base r: [[1 2]
 [3 4]]

base f: None

ऊपरी उदाहरण में:

  • परिणामों के मेमोरी स्थान अलग-अलग हैं,
  • परिणाम समान दिखते हैं
  • समतल एक प्रति लौटाएगा
  • ravel एक दृश्य लौटाएगा।

अगर कुछ कॉपी है तो हम कैसे चेक करेंगे? की .baseविशेषता का उपयोग करना ndarray। यदि यह एक दृश्य है, तो आधार मूल सरणी होगा; अगर यह एक प्रति है, आधार हो जाएगा None

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