ایجاد آرایه با ماژول نامپای در پایتون (Python NumPy)

ما می توانیم با استفاده از تابع ()array یک NumPy ndarray object در پایتون ایجاد کنیم.

بهزاد میرزازاده بهزاد میرزازاده

زمان مطالعه

3 دقیقه

بازدید

975

پرسش و پاسخ

0
ایجاد آرایه با ماژول نامپای در پایتون (Python NumPy)

مثال: در زیر یک NumPy ndarray object با استفاده از تابع ()array ایجاد کرده ایم.

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr)
print(type(arr))

ایجاد آرایه (Array) با ماژول NumPy در پایتون (Python)

متد type : یک تابع داخلی پایتون (Python) است که نوع شیئی که به آن ارسال شده است را به ما نشان می دهد. مانند مثال بالا که به ما نشان می دهد arr شیئی از نوعnumpy.ndarray  است.

در کل 6 مکانیسم برای ایجاد آرایه ها وجود دارد:

  1. تبدیل از سایر ساختارهای پایتون (به عنوان مثال لیست ها در پایتون، تاپل پایتون و …)
  2. توابع داخلی ایجاد آرایه NumPy (مانند arrange, ones, zeros و غیره)  
  3. تکرار کردن، پیوستن، یا تغییر دادن آرایه های موجود
  4. خواندن آرایه ها از دیسک، از فرمت های استاندارد یا فرمت های سفارشی
  5. ایجاد آرایه ها از بایت های خام، با استفاده از رشته پایتون یا بافرها
  6. استفاده از توابع کتابخانه ویژه (مانند random)

می توانید از این روش ها برای ایجاد ndarray یا آرایه های ساخت یافته استفاده کنید.

ایجاد آرایه در پایتون تبدیل از سایر ساختارهای پایتون

برای ایجاد ndarray می توانیم یک لیست (List)، یک چندتایی (Tuple)  استفاده کنیم. لیست ها و چند تایی ها به ترتیب با استفاده از […] و (…) تعریف می شوند. لیست ها و چندتایی ها می توانند نوع یک ndarray را مشخص کنند:

به طور کلی، هر شی آرایه ای در ماژول NumPy در پایتون (Python) ndarray نامیده می شود.

مثال: در زیر از یک چندتایی (Tuple) برای ایجاد یک آرایه NumPy استفاده کرده ایم.

import numpy as np
arr = np.array((1, 2, 3, 4, 5))
print(arr)

روش ایجاد آرایه در NumPy در پایتون (Python)

ویژگی dtype

وقتی از numpy.array برای تعریف یک آرایه جدید استفاده می کنید، باید نوع عناصر موجود در آرایه را هم در نظر بگیرید، که می تواند با dtype به صراحت مشخص شود. این ویژگی به شما کنترل بیشتری بر ساختارهای داده ای اساسی و نحوه مدیریت عناصر در توابع C++/C می دهد. اگر در تعریف نوع عبارت dtype دقت نکنید، می تواند برای شما سرریز ناخواسته به وجود بیاورد. به مثال زیر دقت کنید:

import numpy as np
arr = np.array([1, 2, 3, 4, 5],dtype=np.int8)
print(arr)

ویژگی dtype در ماژول NumPy در پایتون (Python)

یک عدد صحیح 8 بیتی (int8) دارای محدوده عددی از 128- تا 127 است. انتصاب نوع آرایه ای int8 به اعداد صحیح خارج از محدوده عددی آن منجر به ایجاد سرریز می شود. این ویژگی اغلب می تواند اشتباه فهمیده شود. اگر محاسبات را بدون تطابق dtype انجام دهید، موجب دریافت نتایج ناخواسته می شوید، مانند مثال زیر.

Import numpy as np
a = np.array([2, 3, 4], dtype = np.uint32)
b = np.array([5, 6, 7], dtype = np.uint32)
c_unsigned32 = a - b
print('unsigned c:', c_unsigned32, c_unsigned32.dtype)
c_signed32 = a - b.astype(np.int32)
print('signed c:', c_signed32, c_signed32.dtype)

ویژگی dtype در ماژول NumPy در پایتون (Python)

توجه داشته باشید وقتی با دو نوع آرایه یکسان عملیاتی را انجام می دهید، آرایه به دست آمده هم از همان نوع خواهد بود. هنگامی که عملیات را با dtype های مختلف انجام دهید، NumPy نوع جدیدی را اختصاص خواهد داد که همه عناصر آرایه دخیل در محاسبه را شامل می شود. در مثال بالا uint32 و int32 را به صورت int64 نشان داده است.

رفتار پیش فرض ماژول NumPy برای ایجاد آرایه، برای نوع های اعداد صحیح با علامت 64 بیتی یا اعداد نقطه شناور با دقت دو رقم اعشار، به ترتیب int64 و float است. اگر نیاز دارید که آرایه های شما نوع خاصی باشند، باید هنگام ایجاد آرایه، نوع آن را با مقدار دهی dtype مشخص کنید.

ابعاد در آرایه ها

یک بعد در آرایه ها، یک مرحله از عمق یک آرایه (آرایه های تو در تو)  است.

  • لیستی که فقط یک مقدار دارد، یک آرایه صفر بعدی ایجاد می کند  (0-D)
  • لیستی از اعداد یک آرایه یک بعدی ایجاد می کنند  (1-D)
  • لیستی از لیست ها یک آرایه دو بعدی ایجاد می کنند (2-D)
  • لیست های تو در تو آرایه هایی با ابعاد بالاتر ایجاد می کنند.

آرایه های تو در تو : آرایه هایی هستند که درون خودشان دارای آرایه به عنوان عنصر هستند.

آرایه های 0 بعدی (0-D)

آرایه های 0-D یا Scalars، عناصر یک آرایه هستند، یعنی هر مقدار در یک آرایه، یک آرایه 0-D است.

مثال: در زیر یک آرایه 0-D با مقدار 42 ایجاد کرده ایم.

import numpy as np
arr = np.array(42)
print(arr)

آرایه های 0 بعدی (0-D) در ماژول NumPy در پایتون (Python)

آرایه های تک بعدی (1-D)

آرایه ای که دارای آرایه های 0-D به عنوان عناصر خود هستند، آرایه های 1-D یا تک بعدی نامیده می شوند.

آرایه های تک بعدی، رایج ترین و اساسی ترین آرایه ها هستند.

مثال: در زیر ما یک آرایه تک بعدی که حاوی مقادیر 1 تا 5 است را ایجاد کرده ایم.

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr)

آرایه های تک بعدی (1-D) در ماژول NumPy در پایتون (Python)

آرایه های دو بعدی (2-D)

آرایه ای که حاوی آرایه های تک بعدی به عنوان عناصر خود باشند، آرایه دو بعدی یا 2-D نامیده می شوند.

این نوع آرایه ها اغلب برای نشان دادن ماتریس ها و یا تانسور های درجه 2 استفاده می شوند.

نکته: «تانسور» (Tensor)، نقطه‌ای از فضا است که توسط یک یا چند شاخص که بیانگر مرتبه آن است، توصیف می‌شود. تانسور ها در یادگیری عمیق و علم داده بسیار کاربردی هستند.

برای درک بیشتر تفاوت Scalar و آرایه افقی/عمودی و ماتریس و تنسور ها تصویری را برای شما آماده کرده ام.

«تانسور» (Tensor)، نقطه‌ای از فضا است که توسط یک یا چند شاخص که بیانگر مرتبه آن است، توصیف می‌شود

نکته: NumPy دارای یک زیر ماژول کامل برای عملیات ماتریسی به نام numpy.mat است.

مثال: در زیر یک آرایه دو بعدی که شامل دو آرایه تک بعدی با مقادیر 1,2,3 و 4,5,6 ایجاد کرده ایم.

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

آرایه های دو بعدی (2-D) در ماژول NumPy در پایتون (Python)

آرایه های سه بعدی (3-D)

آرایه ای که دارای آرایه های دو بعدی (ماتریس) ، به عنوان عناصر خود است را آرایه های سه بعدی یا 3-D می نامند.

این آرایه ها برای نشان دادن تانسور های درجه 3 استفاده می شوند.

مثال: در زیر یک آرایه سه بعدی که شامل دو آرایه دو بعدی با مقادیر 1,2,3 و 4,5,6 است، ایجاد کرده ایم.

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

آرایه های سه بعدی (3-D) در ماژول NumPy در پایتون (Python)

بررسی ابعاد یک آرایه

آرایه های ماژول NumPy یک ویژگی با نام ndim را ارائه می دهند که یک عدد که یک عدد صحیح را بر می گرداند و به ما می گوید که آرایه مورد نظر دارای چند بعد است.

مثال: در زیر بررسی کرده ایم که آرایه های موجود دارای چند بعد هستند.

import numpy as np
a = np.array(42)
b = np.array([1, 2, 3, 4, 5])
c = np.array([[1, 2, 3], [4, 5, 6]])
d = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])
print(a.ndim)
print(b.ndim)
print(c.ndim)
print(d.ndim)

بررسی ابعاد یک آرایه در ماژول NumPy در پایتون (Python)

آرایه هایی با ابعاد بالاتر

یک آرایه می تواند هر تعداد ابعاد داشته باشد و محدودیتی ندارد.

هنگامی که می خواهید آرایه ای را ایجاد کنید، می توانید با ویژگی ndmin تعداد ابعاد آرایه را مشخص کنید.

مثال: در زیر آرایه ای 5 بعدی با ویژگی ndmin ایجاد کرده ایم و بررسی کرده ایم که آیا دارای 5 بعد است یا خیر.

import numpy as np
arr = np.array([1, 2, 3, 4], ndmin=5)
print(arr)
print('number of dimensions :', arr.ndim)

تعیین ابعاد آرایه با ویژگی ndmin در ماژول NumPy در پایتون (Python)

در این آرایه درونی ترین بعد (پنجمین بعد) دارای 4 عنصر است، چهارمین بعد دارای یک عنصر است که بردار است، سومین بعد دارای یک عنصر است که ماتریس بردار است، دومین بعد دارای یک عنصر است که یک آرایه 3 بعدی است و اولین بعد دارای یک عنصر است که یک آرایه 4 بعدی است.

 

توابع داخلی ایجاد آرایه در ماژول نامپای

این روش دومین مکانیسم ایجاد آرایه است. ماژول نامپای دارای بیش از 40 تابع داخلی برای ایجاد آرایه است که می توانید در این آدرس همه آن ها را مطالعه کنید.

این توابع را می توان بر اساس ابعاد آرایه ای که ایجاد می کنند، تقریبا به سه دسته تقسیم کرد:

  • 1D Array
  • 2D Array
  • Ndarray

توابع ایجاد آرایه یک بعدی

توابع ایجاد آرایه یک بعدی، به عنوان مثال numpy.linspace و numpy.arange به طور کلی حداقل به دو ورودی شروع (start) و پایان (stop) نیاز دارند.

تابع numpy.arange آرایه هایی را ایجاد می کند که به طور منظم افزایش مقدار داده می شوند. در مثال زیر چند نمونه نشان داده شده است.

Import numpy as np
np.arange(10)
np.arange(2, 10, dtype=float)
np.arange(2, 3, 0.1)

توابع ایجاد آرایه یک بعدی NumPy در پایتون (Python)

نکته: بهترین روش برای ایجاد آرایه با تابع numpy.arange، استفاده از مقادیر صحیح شروع (start)، پایان (stop) و گام افزایش (step) است. در مورد dtype نیز نکات ریزی در این مثال وجود دارد. در مثال بالا، در دومین مورد، از ویژگی dtype استفاده شده است، اما در آرایه سوم کهdtype  مشخص نشده است، چون گام آن 0.1 است، مقدار dtype آن برابر با float است. به علت خطای گرد کردن عدد، بعضی اوقات شامل مقدار پایان (stop) می شود.

تابع numpy.linspace، آرایه هایی با تعداد مشخصی از عناصر ایجاد می کند و فواصل مشخصی بین مقادیر ایجاد می کند. به مثال زیر دقت کنید:

Import numpy as np
a = np.linspace(1., 4., 6)
print(a)

توابع ایجاد آرایه یک بعدی NumPy در پایتون (Python)

مزیت این تابع ایجاد آرایه این است که تعداد عناصر را تضمین می کند و آرایه شامل مقادیر نقطه شروع (start) و نقطه پایان (stop) خواهد بود، در صورتی که در تابع numpy.arange(start, stop, step)، آرایه شامل نقطه پایان (stop) نبود.

توابع ایجاد آرایه دو بعدی

توابع ایجاد آرایه های دو بعدی مانند تابع numpy.eye، تابع numpy.diag و تابع numpy.vander، ویژگی های ماتریس های خاصی را تعریف می کنند که به صورت آرایه های دو بعدی نمایش داده می شوند.

np.eye(m , n) یک ماتریس هویت دو بعدی ایجاد می کند. عناصری که سطر و ستون آن ها برابر هستند دارای مقدار 1 و بقیه دارای مقدار 0 هستند.

مثال: در زیر دو آرایه هویت ایجاد کرده ایم.

Import numpy as np
a = np.eye(3)
b = np.eye(3, 5)
print(a)
print(b)

توابع ایجاد آرایه دو بعدی NumPy در پایتون (Python)

تابع numpy.diag یک آرایه دو بعدی ایجاد می کند که مقادیر آن در عناصر مورب ماتریس دو بعدی گنجانده می شود. همچنین اگر یک آرایه دو بعدی به آن پاس بدهیم، یک آرایه یک بعدی که شامل عناصر مورب آرایه دو بعدی است را برمی گرداند.

دو تابع ایجاد آرایه بالا می توانند هنگام انجام محاسبات جبر خطی مفید و کاربردی باشند.

مثال هایی از تابع ایجاد آرایه numpy.diag :

Import numpy as np
a = np.diag([1, 2, 3])
b = np.diag([1, 2, 3], 1)
c = np.array([[1, 2], [3, 4]])
d = np.diag(c)
print(a)
print(b)
print(c)
print(d)

توابع ایجاد آرایه دو بعدی NumPy در پایتون (Python)

تابع vander(x , n)، ماتریس واندرموند (Vandermonde) را به عنوان یک آرایه دو بعدی در ماژول NumPy تعریف می کند.

ماتریس واندرموند (Vandermonde): ماتریس واندرموند در جبر خطی به ماتریسی می گویند که دارای یک تصاعد هندسی باشد.

در زیر چند مثال از تابع ایجاد آرایه numpy.vander را برای شما آورده ایم.

Import numpy as np
a = np.vander(np.linspace(0, 2, 5), 2)
b = np.vander([1, 2, 3, 4], 2)
c = np.vander((1, 2, 3, 4), 4)
print(a)
print(b)
print(c)

توابع ایجاد آرایه دو بعدی NumPy در پایتون (Python)

توابع عمومی ایجاد ndarray

توابع ایجاد ndarray، به عنوان مثال تابع numpy.ones، تابع numpy.zeros و تابع random، آرایه ها را بر اساس شکل دلخواه ایجاد می کنند. توابع ایجاد ndarray می توانند با تعیین طول بعد، آرایه هایی با هر ابعادی ایجاد کنند.

تابع numpy.zeros، یک آرایه با مقادیر 0 با ابعاد مشخص ایجاد می کند.نوع پیش فرض dtype آن float64 است.

مثال: در زیر دو آرایه با مقادیر 0 با تابع numpy.zeros ایجاد کرده ایم.

Import numpy as np
arr = np.zeros((2, 3))
arr2 = np.zeros((2, 3, 2))
print(arr)
print(arr2)

توابع عمومی ایجاد ndarray ماژول NumPy در پایتون (Python)

تابع numpy.ones از هر نظر شبیه به تابع numpy.zeros است با این تفادت که به جای اینکه آرایه را با مقادیر 0 پر کند، با مقادیر 1 آن ها را پر می کند.

مثال: در زیر دو آرایه با مقادیر 1 با تابع numpy.ones ایجاد کرده ایم.

Import numpy as np
arr = np.ones((2, 3))
arr2 = np.ones((2, 3, 2))
print(arr)
print(arr2)

توابع عمومی ایجاد ndarray ماژول NumPy در پایتون (Python)

متد تصادفی numpy.random یک آرایه با ابعاد مشخص، با مقادیر تصادفی بین دو مقدار 0 و 1 ایجاد می کند. در مثال زیر دو آرایه با اشکال (2,3) و (2,3,2) ایجاد شده است.

import numpy.random as npr
a = npr.random((2,3))
b = npr.random((2,3,2))
print(a)
print(b)

توابع عمومی ایجاد ndarray ماژول NumPy در پایتون (Python)

تابع numpy.indices مجموعه ای از آرایه ها را ایجاد می کند. (به عنوان آرایه ای با ابعاد بالاتر)

مثال: در زیر یک آرایه با تابع numpy.indices ایجاد کرده ایم.

Import numpy as np
a = np.indices((3,3))
print(a)

توابع عمومی ایجاد ndarray ماژول NumPy در پایتون (Python)

این روش برای ارزیابی توابع چند بعدی در یک شبکه معمولی بسیار مفید و کاربردی است.

تکثیر، پیوستن و تغییر آرایه های موجود در پایتون با numpy

سومین روش ایجاد آرایه ها با کپی کردن، الصاق و تغییر در آرایه های موجود است. هنگامی که آرایه ها را ایجاد کردید، می توانید با تکثیر از آرایه های موجود، الصاق آرایه های موجود به یکدیگر و یا تغییر دادن آرایه های موجود، آرایه های جدید ایجاد کنید. هنگامی که یک آرایه یا عناصر یک آرایه را به یک متغیر جدید اختصاص می دهید، شما باید حتما با numpy.copy، آرایه را کپی کنید، در غیر این صورت تغییرات بر روی آرایه اصلی اعمال خواهد شد. به مثال زیر توجه کنید:

Import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
b = a[:2]
b += 1
print('a =', a, '; b =', b)

کپی کردن آرایه موجود برای ایجاد آرایه جدید NumPy در پایتون (Python)

در این مثال، شما یک آرایه جدید ایجاد نکرده اید. شما در این مثال متغیر b را تعریف کرده اید که دو عنصر اول متغیر a را نشان می دهد. هنگامی که یک واحد به b اضافه می کنید، با اضافه کردن یک واحد به a هم همان نتیجه را خواهید گرفت. هنگامی که می خواهید یک آرایه جدید ایجاد کنید، از روال ایجاد آرایه numpy.copy استفاده کنید، مانند مثال زیر:

Import numpy as np
a = np.array([1, 2, 3, 4])
b = a[:2].copy()
b += 1
print('a = ', a, 'b = ', b)

کپی کردن آرایه موجود برای ایجاد آرایه جدید NumPy در پایتون (Python)

تعدادی روال معمول برای الصاق آرایه های موجود به یکدیگر وجود دارد، مانند numpy.vstack, numpy.hstack, numpy.block.

مثال: در زیر مثالی از اتصال چهار آرایه 2 در 2، به یک آرایه 4 در 4، با استفاده از numpy.block آورده ایم.

Import numpy as np
A = np.ones((2, 2))
B = np.eye((2))
C = np.zeros((2, 2))
D = np.diag((-3, -4))
np.block([[A, B],[C, D]])

join کردن آرایه های موجود برای ایجاد آرایه جدید NumPy در پایتون (Python)

خواندن آرایه ها از دیسک، از فرمت های استاندارد و سفارشی

این چهارمین روش ایجاد آرایه هاست، که متداول ترین آن ها برای ایجاد آرایه های بزرگ است. جزئیات این کار بستگی زیادی به فرمت داده های روی دیسک دارد.

فرمت های دودویی استاندارد

زمینه های مختلف، دارای فرمت های استاندارد برای داده های آرایه ها هستند.

HDF5: h5py
FITS: Astropy

نمونه هایی از فرمت ها به طور مستقیم قابل خواندن نیستند، اما تبدیل آن ها برای آن ها دشوار نیست، فرمت هایی هستند که توسط کتابخانه هایی مانند PIL پشتیبانی می شوند.(این کتابخانه قادر به خواندن و نوشتن بسیاری از فرمت های تصویری مانند jpg و png است)

فرمت های ASCII رایج

فایل های محدود شده مانند Comma Separated Value (CSV) و Tab Separated Value (TSV) فایل هایی هستند که برای برنامه هایی مانند Excel و LabView استفاده می شوند. توابع پایتون می توانند این فایل ها را خط به خط بخوانند و تجزیه کنند. ماژول NumPy دارای دو روال numpy.loadtxt و numpy.genfromtxt برای وارد کردن یک فایل با داده های محدود است. در زیر یک مثال ساده آورده ایم که یک فایل CSV را خوانده و به آرایه تبدیل کرده است.

فایل simple.csv :

فرمت های ASCII رایج

خواندن و ایجاد آرایه از آن با numpy.loadtxt :

خواندن آرایه ها از دیسک برای ایجاد آرایه NumPy در پایتون (Python)

فایل های ASCII رایج را می توان با استفاده از scipy.io و Pandas نیز خواند.

ایجاد آرایه از بایت های خام با استفاده از strings (رشته ها) و Buffers (بافرها)

این پنجمین روش ایجاد آرایه در NumPy است که روش های زیادی برای آن وجود دارد. اگر فایل دارای فرمت نسبتا ساده ای باشد، می توانید یک کتابخانه I/O ساده بنویسید و از تابع ماژول NumPy با عنوان fromfile() و یا .tofile() برای خواندن و نوشتن مستقیم آرایه های NumPy استفاده کنید. اگر یک کتابخانه خوب C یا ++C وجود داشته باشد که داده ها را بخواند، می توان آن کتابخانه را با تکنیک های مختلفی نوشت، هر چند که مطمئنا کارایی بهتر و بیشتری دارند، اما برای ایجاد ارتباط با C یا ++C نیاز به دانش پیشرفته تری دارید.

استفاده از توابع کتابخانه های ویژه (مانند SciPy, Pandas و OpenCV)

پایتون یک کتابخانه اساسی برای محفظه های آرایه در پشته محاسبات علمی پایتون است. بسیاری از کتابخانه های پایتون از جمله SciPy ، Pandas و OpenCV، از NumPy ndarray به عنوان فرمت رایج برای تبادل داده استفاده می کنند، این کتابخانه ها می توانند آرایه های NumPy را ایجاد، اجرا و با آن ها کار کنند.