تغییر شکل آرایه (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 بعدی بساز و آن را به شکل 2×3 تغییر بده.
- همین آرایه را به شکل 3 بعدی مثل 2×3×1 امتحان کن.
- یک آرایه چندبعدی بساز و با
reshape(-1)آن را تخت کن.
برای یادآوری مفهوم شکل، صفحه شکل آرایه در نامپای را مرور کن.
اگر روی ویو و کپی حساس هستی، حتما به صفحه کپی در برابر View در نامپای هم سر بزن.
در نهایت، برای مرور خود همین مبحث، همیشه می توانی به صفحه تغییر شکل آرایه در نامپای برگردی.
جمع بندی سریع
- تغییر شکل آرایه در نامپای فقط چیدمان عناصر را عوض می کند.
- تعداد کل عناصر قبل و بعد باید کاملا برابر باشد.
reshapeمعمولا ویو برمی گرداند؛ باbaseآن را چک کن.- با مقدار
-1می توانی یک بعد ناشناخته بسازی. - برای تخت کردن، از
reshape(-1)استفاده کن و نتیجه را ببین.