فهرست سرفصل‌های NumPy
خانه (HOME) مقدمه (Intro) شروع کار (Getting Started) ساخت آرایه ها (Creating Arrays) ایندکس گذاری آرایه (Array Indexing) برش آرایه (Array Slicing) انواع داده (Data Types) کپی در برابر View (Copy vs View) شکل آرایه (Array Shape) تغییر شکل آرایه (Array Reshape) حلقه روی آرایه (Array Iterating) ترکیب آرایه ها (Array Join) تقسیم آرایه ها (Array Split) جستجو در آرایه (Array Search) مرتب سازی آرایه (Array Sort) فیلتر کردن آرایه (Array Filter) مقدمه تصادفی سازی (Random Intro) توزیع داده (Data Distribution) جابه جایی تصادفی (Random Permutation) ماژول Seaborn (Seaborn Module) توزیع نرمال (Normal Distribution) توزیع دوجمله ای (Binomial Distribution) توزیع پواسون (Poisson Distribution) توزیع یکنواخت (Uniform Distribution) توزیع لجستیک (Logistic Distribution) توزیع چندجمله ای (Multinomial Distribution) توزیع نمایی (Exponential Distribution) توزیع کای دو (Chi Square Distribution) توزیع ریلی (Rayleigh Distribution) توزیع پارتو (Pareto Distribution) توزیع زیف (Zipf Distribution) مقدمه ufunc (ufunc Intro) ساخت تابع ufunc (ufunc Create Function) حساب ساده با ufunc (ufunc Simple Arithmetic) گرد کردن اعشار با ufunc (ufunc Rounding Decimals) لگاریتم ها با ufunc (ufunc Logs) جمع ها با ufunc (ufunc Summations) حاصل ضرب ها با ufunc (ufunc Products) تفاضل ها با ufunc (ufunc Differences) کمترین مضرب مشترک با ufunc (ufunc Finding LCM) بزرگترین مقسوم علیه مشترک با ufunc (ufunc Finding GCD) توابع مثلثاتی با ufunc (ufunc Trigonometric) توابع هذلولوی با ufunc (ufunc Hyperbolic) عملیات مجموعه ای با ufunc (ufunc Set Operations) ویرایشگر (Editor) آزمون (Quiz) تمارین (Exercises) سرفصل دوره (Syllabus) برنامه مطالعه (Study Plan) گواهینامه (Certificate)
نتیجه‌ای برای جستجو یافت نشد.
NumPy

NumPy — تغییر شکل آرایه (Array Reshape)

آخرین بروزرسانی: 1404/08/25

تغییر شکل آرایه (Array Reshape)

در نامپای، تغییر شکل آرایه در نامپای یعنی چیدن دوباره اعداد بدون کم و زیاد شدن. مثل وقتی نیمکت های کلاس را جابه جا می کنی، اما تعداد دانش آموزها همان است.

تغییر شکل آرایه در نامپای یعنی چه؟

شکل آرایه یعنی در هر بعد چند عنصر داریم. وقتی آرایه را reshape می کنیم، فقط نحوه چیدمان این عناصر عوض می شود.

بنابراین تعداد کل عناصر همیشه ثابت می ماند. فقط تعداد ردیف ها، ستون ها یا بعدهای جدید تغییر می کند.

تغییر شکل آرایه از 1 بعدی به 2 بعدی

فرض کن یک لیست صاف از اعداد داری؛ مثل یک ردیف صندلی. حالا می خواهی آن را به شکل جدول چند ردیفی تبدیل کنی.

در مثال زیر یک آرایه 1 بعدی با 12 عنصر را به آرایه 2 بعدی با شکل 4×3 تبدیل می کنیم.

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

newarr = arr.reshape(4, 3)

print(newarr)

مشاهده در ادیتور

اینجا عدد 4 یعنی چهار ردیف داریم و عدد 3 یعنی هر ردیف سه عنصر دارد. اگر 4×3 را ضرب کنی دوباره 12 می شود.

تغییر شکل آرایه از 1 بعدی به 3 بعدی

آرایه سه بعدی را مثل چند جدول روی هم تصور کن؛ شبیه چند طبقه ساختمان.

در مثال زیر، همان 12 عنصر را به آرایه سه بعدی با شکل 2×3×2 تبدیل می کنیم.

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

newarr = arr.reshape(2, 3, 2)

print(newarr)

مشاهده در ادیتور

اینجا 2 یعنی دو بلوک داریم، هر بلوک 3 ردیف دارد و هر ردیف 2 عنصر. باز هم 2×3×2 برابر 12 است.

آیا می توانیم به هر شکلی تغییر دهیم؟

تقریباً هر شکلی مجاز است؛ اما یک شرط مهم داریم. تعداد عناصر قبل و بعد باید دقیقا برابر باشد.

در مثال زیر، آرایه 8 عنصری را اشتباهی به شکل 3×3 تبدیل می کنیم. چون 3×3 می شود 9، نامپای خطا می دهد.

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

newarr = arr.reshape(3, 3)

print(newarr)

مشاهده در ادیتور

نکته: همیشه قبل از تغییر شکل، تعداد عناصر را چک کن. اگر ضرب ابعاد جدید برابر تعداد عناصر نباشد، خطا می گیری.

تغییر شکل آرایه؛ کپی است یا View؟

در نامپای، کپی (Copy) یعنی آرایه جدید حافظه خود را دارد. اما ویو (View) فقط نمایی از داده اصلی است.

می توانیم با ویژگی base بفهمیم reshape معمولا ویو برمی گرداند یا کپی.

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

print(arr.reshape(2, 4).base)

مشاهده در ادیتور

اگر خروجی base خود آرایه اصلی باشد، یعنی نتیجه reshape یک ویو است. درباره تفاوت کامل، صفحه کپی در برابر View در نامپای را ببین.

بعد ناشناخته و مقدار -1

گاهی تعداد دقیق یکی از ابعاد را نمی دانی یا حوصله حسابش را نداری. در این حالت می توانی برای آن بعد مقدار -1 بدهی.

نامپای خودش عدد مناسب را حساب می کند؛ فقط باید همه چیز با تعداد عناصر جور شود.

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

newarr = arr.reshape(2, 2, -1)

print(newarr)

مشاهده در ادیتور

نکته: فقط اجازه داری برای یک بعد مقدار -1 بدهی. اگر برای دو بعد -1 بگذاری، نامپای نمی فهمد کدام را چطور حساب کند.

تخت کردن آرایه ها با reshape(-1)

تخت کردن آرایه یعنی تبدیل آرایه چندبعدی به آرایه 1 بعدی. این کار مثل این است که جدول بزرگی از نمره ها را ردیفی پشت سر هم بنویسی.

می توانی برای این کار از reshape(-1) استفاده کنی.

import numpy as np

arr = np.array([[1, 2, 3],
                [4, 5, 6]])

newarr = arr.reshape(-1)

print(newarr)

مشاهده در ادیتور

نکته: نامپای توابع دیگری هم برای این کار دارد؛ مثل flatten و ravel. همچنین توابعی مثل rot90 و flip برای جابه جا کردن جهت عناصر هستند. این ها بیشتر در سطح پیشرفته استفاده می شوند.

گام های تمرینی برای تغییر شکل آرایه

برای تمرین بهتر تغییر شکل آرایه در نامپای این مراحل را انجام بده:

  1. یک آرایه 1 بعدی بساز و آن را به شکل 2×3 تغییر بده.
  2. همین آرایه را به شکل 3 بعدی مثل 2×3×1 امتحان کن.
  3. یک آرایه چندبعدی بساز و با reshape(-1) آن را تخت کن.

برای یادآوری مفهوم شکل، صفحه شکل آرایه در نامپای را مرور کن.

اگر روی ویو و کپی حساس هستی، حتما به صفحه کپی در برابر View در نامپای هم سر بزن.

در نهایت، برای مرور خود همین مبحث، همیشه می توانی به صفحه تغییر شکل آرایه در نامپای برگردی.

جمع بندی سریع

  • تغییر شکل آرایه در نامپای فقط چیدمان عناصر را عوض می کند.
  • تعداد کل عناصر قبل و بعد باید کاملا برابر باشد.
  • reshape معمولا ویو برمی گرداند؛ با base آن را چک کن.
  • با مقدار -1 می توانی یک بعد ناشناخته بسازی.
  • برای تخت کردن، از reshape(-1) استفاده کن و نتیجه را ببین.