নিম্পিতে চ্যাপ্টা এবং রাভাল ফাংশনগুলির মধ্যে পার্থক্য কী?


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
রেভেল সাধারণত বিদ্যমান অ্যারেতে একটি ভিউ দেয় (কখনও কখনও এটি একটি অনুলিপি দেয়)। ফ্ল্যাটেন একটি নতুন অ্যারে প্রদান করে।
অ্যালেক্স


1
এখানে সূক্ষ্ম পার্থক্যের একটি ব্যবহারিক প্রদর্শন রয়েছে।
প্রেস্টি

সুতরাং কেউ কী উদাহরণ দিতে পারে যখন কোন অ্যারে সমতল করা ভাল এবং কখন তা বর্ধন করা যায়?
আলেকসন্দর

উত্তর:


370

বর্তমান এপিআই হ'ল:

  • flatten সর্বদা একটি অনুলিপি ফেরত দেয়।
  • ravelযখনই সম্ভব সম্ভব মূল অ্যারের একটি ভিউ প্রদান করে। এটি মুদ্রিত আউটপুটটিতে দৃশ্যমান নয়, তবে আপনি যদি রাভেল দ্বারা ফিরে আসা অ্যারেটি পরিবর্তন করেন তবে এটি মূল অ্যারেতে প্রবেশকারীগুলিকে সংশোধন করতে পারে। আপনি যদি ফ্ল্যাট থেকে ফিরে আসা অ্যারেতে এন্ট্রিগুলি পরিবর্তন করেন তবে এটি কখনই ঘটবে না। কোন মেমোরি অনুলিপি করা না হওয়ায় রেভেল প্রায়শই দ্রুত হয় তবে আপনাকে যে অ্যারেটি ফিরিয়ে দেয় তা সংশোধন করতে আপনাকে আরও যত্নবান হতে হবে।
  • reshape((-1,)) অ্যারের স্ট্রাইডগুলি যখনই এটির অনুমতি দেয় তখনও একটি ভিউ পাওয়া যায় এমনকি এর অর্থ আপনি সর্বদা একটি স্বল্প অ্যারে না পান।

30
NumPy বিকাশকারীরা কেন কিছু প্যারামিটার অনুলিপি = [সত্য, মিথ্যা] দিয়ে একটি ফাংশনে আটকে ছিলেন না এমন কোনও ধারণা?
ফ্রাঙ্ক ডারননকোর্ট

41
ব্যাকক্যাম্পেট গ্যারান্টিগুলির কারণে কখনও কখনও এই জাতীয় বিশৃঙ্খলা ঘটে। উদাহরণস্বরূপ: নামী বিকাশকারীরা সম্প্রতি (১.১০ সালে) পূর্বে অন্তর্নিহিত গ্যারান্টি যুক্ত করেছে যে রেভেল একটি সুসংগত অ্যারে (সি প্রসারণ লেখার সময় অত্যন্ত গুরুত্বপূর্ণ এমন একটি সম্পত্তি) ফিরিয়ে দেবে, তাই এখন এআইপিআই a.flatten()নিশ্চিতভাবে একটি অনুলিপি পেতে হবে, a.ravel()এড়াতে বেশিরভাগ অনুলিপি কিন্তু এখনও গ্যারান্টি দেয় যে অ্যারেটি ফিরে এসেছে তা সংঞ্জক এবং a.reshape((-1,))যখনই অ্যারের স্ট্রাইডগুলি এটির অনুমতি দেয় তখনও সত্যই একটি দৃষ্টিভঙ্গি পাওয়া যায় যদিও এর অর্থ আপনি সর্বদা একটি স্বল্প অ্যারে না পান।
আইয়ানএইচ

4
@ হোসেইন আইয়ানএইচ এটি ব্যাখ্যা করেছেন: ravelএকটি স্বতন্ত্র অ্যারের গ্যারান্টি দেয়, এবং তাই এটি কোনও দৃষ্টিভঙ্গি দেয় এমন নিশ্চয়তা দেওয়া হয় না; reshapeসর্বদা একটি দর্শন ফেরত দেয় এবং তাই এটি কোনও স্বতঃস্ফূর্ত অ্যারে প্রদান করে এমন নিশ্চয়তা দেওয়া হয় না।
iled

4
@ হোসেইন এটি সম্পূর্ণ নতুন প্রশ্ন হবে। খুব সংক্ষেপে, একটি পড়া স্মৃতি স্পেসে পড়া এবং লেখার জন্য এটি আরও দ্রুত। এসওতে এখানে বেশ কয়েকটি প্রশ্নোত্তর রয়েছে ( চমৎকার উদাহরণ এখানে ), আপনার যদি আরও কিছু প্রশ্ন থাকে তবে নির্দ্বিধায় একটি নতুন খুলুন।
'40

2
reshape(-1)এর সমতুল্যreshape((-1,))
টম পোহল

53

এখানে ব্যাখ্যা হিসাবে একটি মূল পার্থক্য হ'ল:

  • flatten এটি একটি নাদার্রে অবজেক্টের একটি পদ্ধতি এবং তাই কেবল সত্য নাম্পার অ্যারেগুলির জন্যই বলা যেতে পারে।

  • ravel এটি একটি লাইব্রেরি-স্তরের ফাংশন এবং তাই যেকোনও অবজেক্টকে কল করা যেতে পারে যা সফলভাবে পার্স করা যায়।

উদাহরণস্বরূপ ravel, ndarrays তালিকায় কাজ করবে, যখন flattenএই ধরণের অবজেক্টের জন্য উপলব্ধ নেই।

@ আইএনএইচ তার উত্তরে স্মৃতি পরিচালনার সাথে গুরুত্বপূর্ণ পার্থক্যগুলিও নির্দেশ করে।


4
জটিল করে তোলা (প্রায় যে তথ্য জন্য ধন্যবা) তালিকা নিয়ে কাজ ndarrayএর
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

উপরের উদাহরণে:

  • ফলাফলগুলির মেমরির অবস্থানগুলি পৃথক,
  • ফলাফল একই দেখতে
  • সমতল একটি অনুলিপি ফিরে আসত
  • রেভেল একটি ভিউ ফিরে আসত।

আমরা কীভাবে কিছু পরীক্ষা করে দেখতে পারি? এর .baseবৈশিষ্ট্যটি ব্যবহার করে ndarray। যদি এটির মতামত হয় তবে বেসটি মূল অ্যারে হবে; যদি এটি অনুলিপি হয় তবে বেসটি হবে None

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.