Reshape یک آرایه به معنای تغییر shape آن است. فرم یک آرایه در حقیقت تعداد عناصر موجود در هر بعد و بعد آرایه را مشخص میکند. با reshape میتوان تعداد بعدهای یک آرایه یا تعداد عناصر موجود در هر بعد را تغییر داد.
تغییر آرایه یک بعدی به دو بعدی در numpy
در قطعه کد زیر، یک آرایه یک بعدی را به آرایه دو بعدی تبدیل کردهایم. آرایه دو بعدی ما شامل ۴ آرایه یک بعدی است که هر کدام ۳ درایه دارند؛ بنابراین این آرایه در مجموع ۱۲ عنصر اسکالر دارد.
1 2 3 4 5 6 7 |
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) |
تغییر آرایه یک بعدی به سه بعدی در numpy
در قطعه کد زیر، یک آرایه یک بعدی را به آرایه سه بعدی تبدیل کردهایم. آرایه سه بعدی ما شامل ۲ آرایه دو بعدی است. هر یک از این آرایههای دو بعدی، سه آرایهی یک بعدی دارند؛ هر یک از آرایههای یک بعدی نیز ۲ عنصر دارند. بنابراین این آرایه نیز در مجموع ۱۲ عنصر اسکالر دارد.
1 2 3 4 5 6 7 |
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) |
آیا در numpy، انجام reshape هر از هر بعد به هر بعدی امکانپذیر است؟
اگر تعداد عناصر اسکالر موجود در هر دو آرایه یکسان باشد، تبدیل بعد امکانپذیر است. به عنوان مثال اگر یک آرایه با ۱۲ عنصر داشته باشیم، میتوان آن را به آرایههایی با فرم (۳,۴) یا (۲,۲,۳) تبدیل کرد، زیرا ضرب عناصر آنها ۱۲ میشود؛ اما این آرایه را نمیتوان به آرایهای با فرم (۵,۳) تبدیل کرد؛ زیرا تعداد عناصر اسکالر موجود در این آرایه، ۱۵تاست. به عنوان مثالی دیگر، کد زیر را اجرا کنید؛ این کد به خطا منجر خواهد شد.
1 2 3 4 5 6 7 |
import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7, 8]) newarr = arr.reshape(3, 3) print(newarr) |
تبدیل فرم (reshape) آرایه، یک copy ایجاد میکند یا یک view؟
برای فهمیدن این موضوع میتوانید کد زیر را اجرا کنید:
1 2 3 4 5 |
import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7, 8]) print(arr.reshape(2, 4).base) |
مشاهده میکنید که یک view ایجاد میشود نه یک copy؛ یعنی اگر در آرایه جدید تغییری ایجاد کنید، در آرایه اصلی نیز تغییر ایجاد میشود.
آیا میتوان در تغییر فرم (reshape) آرایه numpy، از بعد نامعلوم استفاده کرد؟
بله. با استفاده از تابع reshape میتوان یکی از بعدها را نامعلوم فرض کرد تا رایانه یک مقدار درست برای آن بعد در نظر بگیرد. برای انجام این کار باید عدد ۱- را به عنوان ورودی به reshape دهید. به مثال زیر توجه کنید تا موضوع روشن شود:
1 2 3 4 5 6 7 |
import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7, 8]) newarr = arr.reshape(2, 2, -1) print(newarr) |
توجه کنید که تنها یکی از آرگومانهای reshape را میتوان ۱- در نظر گرفت.
مسطح کردن آرایه نامپای با استفاده از rshape
در قطعه کد زیر، یک آرایه با بعد دلخواه را به صورت آرایه یک بعدی درآوردهایم. به این کار مسطحسازی (flattening) آرایه میگوییم:
1 2 3 4 5 6 7 |
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) newarr = arr.reshape(-1) print(newarr) |
برای تغییر فرم و تغییر چیدمان اعضای آرایه در numpy، توابع زیاد دیگری نیز وجود دارند که در صورت نیاز میتوان از آنها استفاده کرد. برخی از این توابع عبارتند از:
- Flatten
- Ravel
- Rot90
- Flip
- Fliplr
- Flipud
ببخشید بقیه توابع باید یاد گرفت یا همین reshape کابردش با بقیو توابع مثل Flatten
Ravel
Rot90
Flip
Fliplr
Flipud
یکی هست ؟؟؟ مرسی ازتون
سلام و وقت بخیر
خیر یکسان نیستند. هر کدام از این توابع، بسته به نوع کاربردی که مد نظرتون هست، ممکن است آن کار را راحتتر یا سختتر انجام بدن. انجام برخی کارها به وسیله این توابع نیز ممکن نیست. سعی میکنیم حتما این مقاله رو کامل کنیم و بقیه کاربردها رو هم بررسی کنیم.