تقسیم آرایه ها (Array Split)
اینجا با تقسیم آرایه ها در نامپای کار می کنیم؛ یعنی برعکس ترکیب، یک آرایه بزرگ را به چند تکه کوچک و مرتب تبدیل می کنیم. مثل وقتی لیست بچه های کلاس را برای گروه بندی، به چند لیست کوچک تقسیم می کنی.
تقسیم آرایه ها در نامپای یعنی چه؟
در بخش ترکیب آرایه ها (Array Join) چند آرایه را یکی می کردیم. حالا در تقسیم آرایه ها در نامپای برعکس عمل می کنیم؛ یک آرایه را به چند آرایه کوچک می شکنیم.
تابع array_split() این کار را انجام می دهد. به آن خود آرایه و تعداد قسمت ها را می دهیم و در خروجی، لیستی از آرایه های جدا شده تحویل می گیریم.
تقسیم ساده آرایه 1 بعدی با array_split
آرایه 1 بعدی مثل یک صف عدد است. می خواهیم این صف را به چند بخش پشت سر هم تقسیم کنیم.
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
newarr = np.array_split(arr, 3)
print(newarr)
تابع array_split() اینجا آرایه را به سه قسمت تبدیل می کند. خروجی یک لیست است که هر خانه اش خودش یک آرایه جداگانه است.
کم بودن تعداد عنصرها در تقسیم
اگر تعداد عنصرها با تعداد قسمت ها دقیقا جور نباشد، array_split() از انتهای آرایه کمی جابه جا می کند تا تقسیم منطقی شود.
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
newarr = np.array_split(arr, 4)
print(newarr)
نکته مهم این است که تابع split() این انعطاف را ندارد و در چنین حالتی خطا می دهد؛ اما array_split() هوشمندتر رفتار می کند.
دسترسی به آرایه های تکه تکه شده
خروجی array_split() یک لیست از آرایه ها است. پس می توانی مثل هر لیست معمولی به اندیس هایش دسترسی بگیری.
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
newarr = np.array_split(arr, 3)
print(newarr[0])
print(newarr[1])
print(newarr[2])
اینجا سه آرایه جداگانه داریم و هر کدام را با اندیس خودش چاپ می کنیم. دقیقا مثل دسترسی به خانه های یک لیست معمولی در پایتون.
تقسیم آرایه های 2 بعدی روی ردیف ها
آرایه 2 بعدی مثل یک جدول است. وقتی آن را تقسیم می کنیم، می توانیم جدول را به چند جدول کوچکتر روی ردیف ها بشکنیم.
import numpy as np
arr = np.array([[1, 2],
[3, 4],
[5, 6],
[7, 8],
[9, 10],
[11, 12]])
newarr = np.array_split(arr, 3)
print(newarr)
نتیجه سه آرایه 2 بعدی است. هر کدام چند ردیف از جدول اصلی را دارد؛ انگار جدول را به سه بخش عمودی تقسیم کرده ای.
تقسیم آرایه های 2 بعدی با ستون های بیشتر
اگر هر ردیف سه ستون داشته باشد، باز هم می توانیم همان دستور را استفاده کنیم. فقط شکل هر تکه کمی عوض می شود، اما ایده همان است.
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])
newarr = np.array_split(arr, 3)
print(newarr)
باز هم نتیجه سه آرایه 2 بعدی است. این بار هر ردیف سه ستون دارد، اما منطق تقسیم روی ردیف ها ثابت مانده است.
تقسیم روی محورهای مختلف با axis
پارامتر axis مشخص می کند جداسازی روی کدام محور انجام شود. برای آرایه 2 بعدی، axis=0 یعنی روی ردیف ها و axis=1 یعنی روی ستون ها.
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])
newarr = np.array_split(arr, 3, axis=1)
print(newarr)
در این مثال، جدول را از سمت ستون ها به سه جدول کوچکتر تقسیم می کنیم. هر جدول چند ستون از جدول اصلی را در خودش نگه می دارد.
hsplit، vsplit و dsplit در نامپای
تابع hsplit() یک میانبر برای تقسیم افقی است؛ یعنی روی ستون ها. این تابع برعکس تابع hstack() عمل می کند که برای ترکیب بود.
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])
newarr = np.hsplit(arr, 3)
print(newarr)
علاوه بر این، توابع vsplit() و dsplit() هم وجود دارند که برعکس vstack() و dstack() هستند و روی ردیف ها و عمق کار می کنند.
تمرین عملی برای تقسیم آرایه ها در نامپای
برای تمرین، قدم به قدم پیش برو:
- یک آرایه 1 بعدی با 9 عدد بساز و آن را با
array_split()به 4 قسمت تقسیم کن و خروجی را چاپ کن. - یک آرایه 2 بعدی شبیه مثال ها بساز و آن را هم با
axis=0و هم باaxis=1تقسیم کن و شکل هر قسمت را بررسی کن. - برای آرایه 2 بعدی از
hsplit()،vsplit()و اگر سه بعدی ساختی ازdsplit()استفاده کن و با بخش ترکیب آرایه ها (Array Join) مقایسه کن.
اگر شکل آرایه ها برایت مبهم است، صفحه شکل آرایه (Array Shape) را مرور کن. برای مرور کلی، صفحه تقسیم آرایه ها در نامپای می تواند مرجع همیشه گی تو باشد.
جمع بندی سریع
- تقسیم آرایه ها در نامپای برعکس ترکیب آرایه ها است.
array_split()آرایه را به چند تکه تبدیل می کند و خروجی اش لیست است.- تابع
split()انعطافarray_split()را در تقسیم نابرابر ندارد. - با پارامتر
axisمی توانی روی ردیف ها یا ستون ها تقسیم کنی. hsplit()،vsplit()وdsplit()نسخه های مخصوص تقسیم روی محورهای مختلف هستند.