4 ترفند NumPy که هر مبتدی پایتون باید بیاموزد
۴ ترفند NumPy که هر مبتدی پایتون باید بیاموزد
NumPy یکی از محبوب ترین کتابخانه های پایتون است و تقریباً هر برنامه نویس Python با توجه به مزایای استفاده از آن ، آن را برای محاسبات حساب شده استفاده کرده است. آرایه های Numpy فشرده تر از لیست های پایتون هستند. این کتابخانه همچنین با بسیاری از عملیات ماتریس متداول که به شیوه ای بسیار محاسباتی کارآمد انجام می شود بسیار راحت است. در ادامه با وبلاگ هاستینجا همراه باشید.
پس از کمک به همکاران و دوستان خود درمورد مشکلات اهانت آمیز ، من با ۴ ترفند بدیهی آشنا شده ام که یک مبتدی پیتون باید بیاموزد. این ترفندها به شما کمک می کند کدهایی مرتب و خواندنی تر بنویسید.
۱٫ توابع Arg – موقعیت
برای آرایه array ، np.argmax (arr) ، np.argmin (arr) و np.argwhere (شرط (arr)) شاخص های حداکثر مقادیر ، حداقل مقادیر و مقادیر را که به ترتیب یک شرایط تعریف شده توسط کاربر را برآورده می کنند ، باز می گردانند. در حالی که این توابع arg به طور گسترده ای مورد استفاده قرار می گیرند ، ما اغلب از عملکرد np.argsort () که شاخص هایی را که مرتب سازی یک آرایه را برمی گرداند ، غافل می کنیم.
می توانیم از np.argsort برای مرتب سازی مقادیر آرایه ها بر اساس آرایه دیگری استفاده کنیم. در اینجا نمونه ای از مرتب سازی نام دانش آموزان با استفاده از نمرات امتحان آنها آورده شده است. آرایه نام مرتب شده نیز می تواند با استفاده از np.argsort (np.argsort (امتیاز)) به ترتیب اصلی خود برگردد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
score = np.array([70, 60, 50, 10, 90, 40, 80]) name = np.array(['Ada', 'Ben', 'Charlie', 'Danny', 'Eden', 'Fanny', 'George']) sorted_name = name[np.argsort(score)] # an array of names in ascending order of their scores print(sorted_name) # ['Danny' 'Fanny' 'Charlie' 'Ben' 'Ada' 'George' 'Eden'] original_name = sorted_name[np.argsort(np.argsort(score))] print(original_name) # ['Ada' 'Ben' 'Charlie' 'Danny' 'Eden' 'Fanny' 'George'] %timeit name[np.argsort(score)] # 1.83 µs ± 182 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) %timeit sorted(zip(score, name)) # 3.2 µs ± 76.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) |
عملکرد آن سریعتر از استفاده از توابع پیتون داخلی مرتب شده (zip ()) طبقه بندی شده است و مسلما قابل خواندن است.
۲٫ پخش – شکل
پخش چیزی است که یک مبتدی شکارچی ممکن است سهواً آن را انجام دهد. بسیاری از عملیات حسابی بر روی جفت آرایه ها با همان شکل بر اساس عنصر به عنصر اعمال می شوند. پخش ، عملیات آرایه را بدون ایجاد نسخه های بی نیاز از داده ها ، برداری می کند. این منجر به اجرای الگوریتم های کارآمد و خوانایی کد بالاتر می شود.
به عنوان مثال ، می توانید بدون در نظر گرفتن بعد arr ، از تمام مقادیر در یک آرایه با استفاده از arr + 1 استفاده کنید. همچنین می توانید بررسی کنید که آیا تمام مقادیر موجود در یک آرایه از آرایه> 2 بزرگتر است.
اما چگونه می دانیم دو آرایه با پخش سازگار است؟
1 2 3 |
Argument 1 (4D array): 7 × 5 × 3 × 1 Argument 2 (3D array): 1 × 3 × 9 Output (4D array): 7 × 5 × 3 × 9 |
هر ابعاد هر دو آرایه باید برابر باشد یا یکی از آنها ۱ باشد. آنها نیازی به داشتن ابعاد یکسان ندارند. این قوانین در مثال بالا نشان داده شده است.
۳٫ Ellipsis و NewAxis – ابعاد
نحو برای برش یک آرایه numpy است: j جایی که من ، j به ترتیب شاخص شروع و شاخص توقف هستند. به عنوان مثال ، همانطور که در مقاله قبلی ذکر شد – ۵ ویژگی پایتون که آرزو می کردم قبلاً آن را شناخته بودم ، برای یک آرایه numpy arr = np.array (دامنه (۱۰)) ، با فراخوانی arr [: 3] می دهد [۰، ۱، ۲] .
هنگام برخورد با آرایه هایی با ابعاد بالاتر ، از: برای انتخاب کل شاخص ها در امتداد هر محور استفاده می کنیم. ما همچنین می توانیم استفاده کنیم … می توانیم تمام شاخص ها را در بین محورهای مختلف انتخاب کنیم. تعداد دقیق محورهای گسترش یافته استنباط می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
arr = np.array(range(1000)).reshape(2,5,2,10,-1) print(arr[:,:,:,3,2] == arr[...,3,2]) # [[[ True, True], # [ True, True], # [ True, True], # [ True, True], # [ True, True]], # [[ True, True], # [ True, True], # [ True, True], # [ True, True], # [ True, True]]]) print(arr.shape) # (2, 5, 2, 10, 5) print(arr[...,np.newaxis,:,:,:].shape) # (2, 5, 1, 2, 10, 5) |
از طرف دیگر ، استفاده از np.newaxis همانطور که در بالا نشان داده شده است ، یک محور جدید را در یک موقعیت محوری تعریف شده توسط کاربر قرار می دهد. این عمل شکل یک آرایه را با یک واحد از ابعاد گسترش می دهد. در حالی که این کار را می توان با np.expand_dims () نیز انجام داد ، استفاده از np.newaxis بسیار خواندنی تر و مسلما ظریف تر است.
۴ ترفند NumPy که هر مبتدی پایتون باید بیاموزد
۴٫ آرایه نقاب شده (Masked Array) – انتخاب
مجموعه داده ها ناقص هستند. آنها همیشه حاوی آرایه هایی با نوشته های مفقود یا نامعتبر هستند و ما اغلب می خواهیم از آن ورودی ها صرف نظر کنیم. به عنوان مثال ، اندازه گیری از ایستگاه هواشناسی ممکن است حاوی مقادیر گمشده به دلیل خرابی سنسور باشد.
Numpy دارای submodule numpy.ma است که از آرایه های داده با ماسک پشتیبانی می کند. یک آرایه ماسک دار حاوی یک آرایه معمولی و ماسک است که موقعیت ورودی های نامعتبر را نشان می دهد.
1 |
np.ma.MaskedArray(data=arr, mask=invalid_mask) |
ورودی های نامعتبر در یک آرایه گاه با استفاده از مقادیر منفی یا رشته ها مشخص می شوند. اگر مقدار نقاب دار ، مثلاً -۹۹۹ را بدانیم ، می توانیم با استفاده از np.ma.masked_values یک array masked ایجاد کنیم (arr، مقدار = -۹۹۹). هر عملی که با استفاده از یک آرایه ماسک صورت می گیرد ، به طور خودکار آن ورودی های نامعتبر را که در شکل زیر نشان داده شده است ، نادیده می گیرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import math def is_prime(n): assert n > 1, 'Input must be larger than 1' if n % 2 == 0 and n > 2: return False return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2)) arr = np.array(range(2,100)) non_prime_mask = [not is_prime(n) for n in a] prime_arr = np.ma.MaskedArray(data=arr, mask=non_prime_mask) print(prime_arr) # [2 3 -- 5 -- 7 -- -- -- 11 -- 13 -- -- -- 17 -- 19 -- -- -- 23 -- -- -- -- # -- 29 -- 31 -- -- -- -- -- 37 -- -- -- 41 -- 43 -- -- -- 47 -- -- -- -- # -- 53 -- -- -- -- -- 59 -- 61 -- -- -- -- -- 67 -- -- -- 71 -- 73 -- -- # -- -- -- 79 -- -- -- 83 -- -- -- -- -- 89 -- -- -- -- -- -- -- 97 -- --] arr = np.array(range(11)) print(arr.sum()) # 55 arr[-1] = -999 # indicates missing value masked_arr = np.ma.masked_values(arr, -999) print(masked_arr.sum()) # 45 |
در آموزش های بعدی با هاستینجا همراه باشید