پتانسیل کامل NumPy را با تکنیک های نمایه سازی آرایه پیشرفته باز کنید. اندیس گذاری بولی، اندیس گذاری فانتزی و برش را برای انتخاب کارآمد داده ها بیاموزید.
نمایه سازی آرایه NumPy: تسلط بر تکنیک های انتخاب پیشرفته
NumPy، سنگ بنای محاسبات علمی در پایتون، ابزارهای قدرتمندی را برای مدیریت آرایه ها و ماتریس های بزرگ و چند بعدی فراهم می کند. در حالی که نمایه سازی و برش پایه ای اساسی هستند، تسلط واقعی بر NumPy مستلزم ورود به تکنیک های انتخاب پیشرفته تر آن است. این روش ها امکان دستکاری پیچیده داده ها را فراهم می کنند و کاربران را قادر می سازند تا دقیقاً اطلاعات مورد نیاز خود را با بازده قابل توجهی استخراج کنند. این پست شما را از طریق پیچیدگی های اندیس گذاری بولی و اندیس گذاری فانتزی راهنمایی می کند و مثال ها و بینش های عملی را برای مخاطبان جهانی ارائه می دهد.
درک پایه: نمایه سازی و برش پایه
قبل از اینکه وارد قلمرو پیشرفته شویم، یک خلاصه کوتاه از نمایه سازی و برش پایه مفید است. برای یک آرایه 1 بعدی، نمایه سازی ساده است: arr[i] عنصر را در فهرست i بازیابی می کند. برش از نحو arr[start:stop:step] برای انتخاب دامنه ای از عناصر استفاده می کند.
برای آرایه های 2 بعدی، نمایه سازی به انتخاب سطرها و ستون ها گسترش می یابد. به عنوان مثال، arr[row, column] به یک عنصر خاص دسترسی پیدا می کند. برش می تواند به طور مستقل برای سطرها و ستون ها اعمال شود: arr[row_slice, column_slice].
یک آرایه 2 بعدی ساده را در نظر بگیرید:
import numpy as np
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# Accessing an element
print(arr_2d[1, 2]) # Output: 6
# Slicing rows and columns
print(arr_2d[0:2, 1:3])
# Output:
# [[2 3]
# [5 6]]
در حالی که این روش ها مؤثر هستند، هنگام برخورد با معیارهای انتخاب پیچیده می توانند دست و پا گیر شوند. اینجاست که تکنیک های نمایه سازی پیشرفته می درخشند.
نمایه سازی بولی: انتخاب داده ها بر اساس شرایط
نمایه سازی بولی، که اغلب به عنوان انتخاب شرطی از آن یاد می شود، به شما امکان می دهد عناصر را از یک آرایه بر اساس یک شرط بولی انتخاب کنید. این یک تکنیک فوق العاده قدرتمند برای فیلتر کردن داده ها است. شما یک آرایه بولی با همان شکل آرایه اصلی ایجاد می کنید، جایی که True نشان می دهد که عنصر مربوطه باید انتخاب شود و False نشان دهنده حذف است.
نحوه کارکرد
این فرآیند معمولاً شامل انجام یک عملیات مقایسه بر روی آرایه است. این عملیات یک آرایه بولی را برمی گرداند. سپس از این آرایه بولی برای نمایه سازی آرایه اصلی استفاده می کنید.
مثال 1: انتخاب عناصری بزرگتر از یک مقدار
فرض کنید مجموعه داده ای از دمای جهانی دارید و می خواهید تمام روزهایی را که دما از آستانه معینی فراتر رفته است، شناسایی کنید.
# Assume a 1D array of temperatures from various cities worldwide
temperatures = np.array([25.5, 31.2, 18.9, 28.7, 22.1, 35.0, 15.6])
# Set a threshold
threshold = 28.0
# Create a boolean mask
high_temperatures_mask = temperatures > threshold
print(high_temperatures_mask)
# Output: [False True False True False True False]
# Use the mask to select elements
hot_days = temperatures[high_temperatures_mask]
print(hot_days)
# Output: [31.2 28.7 35. ]
این به طور خلاصه تمام دماهای بالای 28.0 درجه را انتخاب می کند. خروجی یک آرایه 1 بعدی جدید است که فقط حاوی مقادیری است که شرط را برآورده می کنند.
مثال 2: کار با آرایه های 2 بعدی
نمایه سازی بولی همچنین می تواند برای آرایه های چند بعدی اعمال شود. هنگامی که با یک آرایه 2 بعدی استفاده می شود، یک ماسک بولی با همان شکل، یک آرایه 1 بعدی را برمی گرداند که حاوی تمام عناصری است که ماسک برای آنها True است.
# A 2D array representing sales figures for different products across regions
sales_data = np.array([[150, 200, 120],
[300, 180, 250],
[90, 220, 160]])
# Identify sales figures above a certain target
target_sales = 200
# Create a boolean mask
successful_sales_mask = sales_data >= target_sales
print(successful_sales_mask)
# Output:
# [[False True False]
# [ True False True]
# [False True False]]
# Select the corresponding sales figures
selected_sales = sales_data[successful_sales_mask]
print(selected_sales)
# Output: [200 300 250 220]
این یک آرایه 1 بعدی از تمام ارقام فروش را برمی گرداند که به هدف رسیده یا از آن فراتر رفته است. این یک راه قدرتمند برای فیلتر کردن داده های چند بعدی بدون حلقه های صریح است.
نمایه سازی بولی با شرایط متعدد
شما می توانید چندین شرط بولی را با استفاده از عملگرهای منطقی ترکیب کنید:
&: AND منطقی عنصر به عنصر|: OR منطقی عنصر به عنصر~: NOT منطقی عنصر به عنصر
نکته مهم: هنگام ترکیب شرایط، هر شرط جداگانه باید به دلیل تقدم عملگر پایتون در پرانتز قرار گیرد.
# Select sales figures that are between 150 and 250 (inclusive)
condition_low = sales_data >= 150
condition_high = sales_data <= 250
between_150_and_250 = sales_data[condition_low & condition_high]
print(between_150_and_250)
# Output: [150 200 180 250 220 160]
این نشان می دهد که چگونه داده ها را که در یک محدوده خاص قرار می گیرند، استخراج کنید، یک کار رایج در تجزیه و تحلیل داده ها.
نمایه سازی فانتزی: انتخاب عناصر با استفاده از آرایه های عدد صحیح
نمایه سازی فانتزی یکی دیگر از تکنیک های انتخاب پیشرفته است که به شما امکان می دهد عناصر را با استفاده از آرایه های اعداد صحیح انتخاب کنید. این با برش، که بلوک های پیوسته داده ها را انتخاب می کند، متمایز است. نمایه سازی فانتزی شما را قادر می سازد تا عناصر دلخواه را از یک آرایه بر اساس فهرست آنها انتخاب کنید.
نحوه کارکرد
شما یک آرایه از شاخص ها را به عملگر نمایه سازی ارائه می دهید. سپس NumPy یک آرایه جدید را برمی گرداند که عناصر مطابق با شاخص های ارائه شده مرتب شده اند.
مثال 1: انتخاب عناصر خاص در یک آرایه 1 بعدی
تصور کنید لیستی از شناسه های کاربری دارید و می خواهید فقط داده های کاربران خاص را بازیابی کنید.
# A list of sample user IDs
user_ids = np.array([101, 105, 110, 102, 115, 108])
# Indices of the users we are interested in
selected_indices = np.array([0, 3, 5]) # Corresponds to user IDs at index 0, 3, and 5
# Select the data for these users
selected_users = user_ids[selected_indices]
print(selected_users)
# Output: [101 102 108]
این یک آرایه جدید را برمی گرداند که فقط شامل `user_ids` در شاخص های مشخص شده است.
مثال 2: نمایه سازی فانتزی با آرایه های 2 بعدی
نمایه سازی فانتزی به ویژه با آرایه های چند بعدی قدرتمند می شود. هنگامی که از آرایه های عدد صحیح برای نمایه سازی یک آرایه 2 بعدی استفاده می کنید، می توانید سطرها، ستون ها یا حتی عناصر منفرد را به روشی غیر پیوسته انتخاب کنید.
دو روش اصلی برای استفاده از نمایه سازی فانتزی با آرایه های 2 بعدی وجود دارد:
- انتخاب سطرها: یک آرایه 1 بعدی از شاخص های سطر ارائه دهید.
- انتخاب عناصر خاص (جفت های سطر، ستون): دو آرایه 1 بعدی از شاخص ها ارائه دهید - یکی برای سطرها و دیگری برای ستون ها. این آرایه ها باید طول یکسانی داشته باشند و عنصر i ام از آرایه شاخص سطر و عنصر i ام از آرایه شاخص ستون، یک عنصر منحصر به فرد را برای انتخاب مشخص می کنند.
انتخاب سطر های خاص
بیایید مجموعه داده ای از قیمت سهام برای شرکت های مختلف در طول چند روز را در نظر بگیریم. ما می خواهیم داده ها را برای شرکت های خاص بازیابی کنیم.
# Stock prices for 3 companies over 4 days
# Rows represent days, columns represent companies
stock_prices = np.array([[100, 150, 200],
[105, 152, 205],
[110, 155, 210],
[115, 160, 215]])
# Indices of the companies we want to examine (e.g., company at index 0 and company at index 2)
company_indices = np.array([0, 2])
# Select the data for these companies across all days
selected_companies_data = stock_prices[:, company_indices]
print(selected_companies_data)
# Output:
# [[100 200]
# [105 205]
# [110 210]
# [115 215]]
در اینجا، : همه سطرها را انتخاب می کند و company_indices ستون های خاص را انتخاب می کند. نتیجه یک آرایه 2 بعدی جدید است که هر ستون مربوط به شرکت های انتخاب شده است.
انتخاب عناصر خاص با استفاده از جفت های سطر و ستون
اینجاست که نمایه سازی فانتزی بیشترین انعطاف پذیری را ارائه می دهد. شما می توانید با تعیین همزمان شاخص های سطر و ستون، عناصر دلخواه را مشخص کنید.
# A grid representing population density across different zones and sectors
population_density = np.array([[1000, 1200, 800, 1500],
[900, 1100, 750, 1400],
[1300, 1400, 950, 1600],
[850, 1050, 700, 1350]])
# We want to check the density at specific zone-sector combinations.
# Let's say we are interested in:
# - Zone 0, Sector 1 (row 0, col 1)
# - Zone 2, Sector 0 (row 2, col 0)
# - Zone 1, Sector 3 (row 1, col 3)
# - Zone 3, Sector 2 (row 3, col 2)
row_indices = np.array([0, 2, 1, 3])
column_indices = np.array([1, 0, 3, 2])
# Select the population densities at these specific locations
specific_locations_density = population_density[row_indices, column_indices]
print(specific_locations_density)
# Output: [1200 1300 1400 700]
خروجی یک آرایه 1 بعدی است که حاوی تراکم جمعیت در مختصات دقیقی است که توسط جفت شاخص ها مشخص شده است.
بینش کلیدی: شکل آرایه خروجی با شکل آرایه های شاخص تعیین می شود. اگر هر دو آرایه شاخص 1 بعدی باشند و طول یکسانی N داشته باشند، خروجی یک آرایه 1 بعدی با طول N خواهد بود. اگر یکی از آرایه های شاخص چند بعدی باشد، آرایه خروجی آن شکل را به ارث می برد.
نمایه سازی فانتزی و پخش
هنگام استفاده از نمایه سازی فانتزی با چندین آرایه شاخص که شکل های متفاوتی دارند، قوانین پخش NumPy وارد عمل می شوند. به عنوان مثال، اگر یک آرایه 2 بعدی را با یک آرایه 1 بعدی برای سطرها و یک عدد صحیح واحد برای ستون ها نمایه سازی کنید، پخش به طور موثر آن شاخص ستون واحد را گسترش می دهد تا با تعداد سطرها مطابقت داشته باشد.
# Let's select all elements from the first two rows, but only from the third column
indices_rows = np.array([0, 1]) # Indices of rows
index_col = 2 # Index of the column
selected_subset = population_density[indices_rows, index_col]
print(selected_subset)
# Output: [800 750]
در این مورد، index_col (که 2 است) پخش می شود تا با شکل indices_rows (که (2,) است) مطابقت داشته باشد و به طور موثر جفت های شاخص (0, 2) و (1, 2) را ایجاد می کند.
ترکیب نمایه سازی بولی و فانتزی
همچنین می توانید نمایه سازی بولی و نمایه سازی فانتزی را برای ایجاد الگوهای انتخاب پیچیده تر ترکیب کنید. به عنوان مثال، ممکن است ابتدا سطرها را بر اساس یک شرط فیلتر کنید و سپس از نمایه سازی فانتزی برای انتخاب ستون های خاص از آن سطر های فیلتر شده استفاده کنید.
بیایید به مثال sales_data برگردیم:
# sales_data = np.array([[150, 200, 120],
# [300, 180, 250],
# [90, 220, 160]])
# Let's say we only want to consider rows where at least one sale figure is above 200
# Create a boolean mask for rows
# We check if any element in a row is greater than 200
row_mask = np.any(sales_data > 200, axis=1)
print(row_mask)
# Output: [False True True]
# Apply this row mask to select relevant rows
filtered_rows = sales_data[row_mask]
print(filtered_rows)
# Output:
# [[300 180 250]
# [ 90 220 160]]
# Now, from these filtered rows, let's use fancy indexing to select specific columns.
# Suppose we want the first and third columns from these filtered rows.
row_indices_for_fancy = np.array([0, 1]) # Indices within the filtered_rows array
column_indices_for_fancy = np.array([0, 2]) # Indices of columns we want
final_selection = filtered_rows[row_indices_for_fancy, column_indices_for_fancy]
print(final_selection)
# Output: [300 160]
این مثال سناریویی را نشان می دهد که در آن ابتدا داده های خود را بر اساس یک شرط گسترده فیلتر می کنید (سطرهایی با فروش بالا) و سپس به طور انتخابی نقاط داده خاصی را از آن سطرهای فیلتر شده استخراج می کنید.
کاربردهای عملی و دیدگاه های جهانی
این تکنیک های نمایه سازی پیشرفته فقط سازه های نظری نیستند. آنها ابزارهای ضروری در برنامه های کاربردی علم داده در دنیای واقعی در سراسر جهان هستند:
- تجزیه و تحلیل مالی: انتخاب قیمت سهام برای شرکت های خاص در تاریخ های خاص، یا شناسایی معاملاتی که آستانه های سودآوری معینی را برآورده می کنند.
- علم آب و هوا: فیلتر کردن داده های دما یا بارندگی برای مناطق جغرافیایی خاص یا دوره های زمانی بر اساس معیارهای تعریف شده. به عنوان مثال، شناسایی مناطق مستعد خشکسالی (به عنوان مثال، بخش هایی از استرالیا، منطقه ساحل در آفریقا) با انتخاب داده های زیر یک معیار بارندگی معین.
- تجارت الکترونیک: تقسیم بندی داده های مشتری برای شناسایی مشتریان با ارزش بالا یا محصولاتی با معیارهای فروش خاص در بازارهای مختلف (به عنوان مثال، اروپا، آسیا، آمریکای شمالی).
- مراقبت های بهداشتی: تجزیه و تحلیل داده های بیمار برای انتخاب سوابق افراد با شرایط خاص یا سابقه درمان در میان جمعیت های مختلف.
- یادگیری ماشین: تهیه مجموعه داده ها با انتخاب ویژگی ها یا نمونه ها بر اساس معیارهای پیچیده، یا استخراج ضرایب مدل برای پارامترهای خاص.
توانایی انتخاب دقیق و کارآمد داده ها برای ایجاد مدل های دقیق، به دست آوردن بینش های معنادار و تصمیم گیری آگاهانه، صرف نظر از موقعیت جغرافیایی یا صنعت، بسیار مهم است.
ملاحظات عملکرد
نمایه سازی پیشرفته NumPy بسیار بهینه شده است. عملیاتی که نیاز به حلقه های صریح پایتون دارند، اغلب توسط NumPy برداری می شوند و منجر به افزایش قابل توجه عملکرد می شوند. با این حال، مهم است که از چند تفاوت ظریف آگاه باشید:
- نمایه سازی بولی به طور کلی یک آرایه 1 بعدی از عناصر انتخاب شده را برمی گرداند. اگر برای عملیات معینی نیاز دارید که شکل اصلی را حفظ کنید، ممکن است نیاز به تغییر شکل یا استفاده از تکنیک های دیگر داشته باشید.
- نمایه سازی فانتزی یک کپی از داده ها را برمی گرداند. اگر آرایه های شاخص عدد صحیح باشند، نتیجه یک کپی است. اگر آرایه های شاخص بولی باشند، نتیجه نیز یک کپی است. این بدان معناست که تغییرات در آرایه برگشتی بر آرایه اصلی تأثیری نمی گذارد.
- برای آرایه های بسیار بزرگ و طرح های نمایه سازی پیچیده، استفاده از حافظه می تواند یک عامل شود. عملیات NumPy آرایه های میانی را ایجاد می کند که حافظه را مصرف می کنند.
هنگامی که عملکرد حیاتی است، به ویژه در برنامه های کاربردی حساس به زمان یا هنگام کار با مجموعه داده های عظیم، پروفایل کردن کد خود و درک عملیات NumPy اساسی می تواند به شما در بهینه سازی بیشتر کمک کند. این ممکن است شامل انتخاب بین نمایه سازی بولی و فانتزی یا بازسازی داده های شما باشد.
بهترین شیوه ها برای نمایه سازی پیشرفته
برای استفاده موثر از قابلیت های نمایه سازی پیشرفته NumPy:
- داده های خود را درک کنید: قبل از نوشتن کد، معیارهای انتخاب را به وضوح تعریف کنید.
- از نام متغیرهای معنادار استفاده کنید: ماسک های بولی و آرایه های شاخص خود را به طور توصیفی نامگذاری کنید (به عنوان مثال،
high_value_customers_mask،target_product_indices). - خوانایی را در اولویت قرار دهید: در حالی که کد مختصر خوب است، کدی را که برای دیگران (و خود آینده تان) قابل درک است، در اولویت قرار دهید. برای شرایط بولی ترکیبی از پرانتز به طور مناسب استفاده کنید.
- به طور افزایشی تست کنید: عملیات نمایه سازی پیچیده را گام به گام بسازید و خروجی را در هر مرحله تأیید کنید.
- از توابع NumPy استفاده کنید: از توابعی مانند
np.where()برای انتخاب شرطی که ممکن است شاخص ها یا مقادیر را برگرداند، یاnp.ix_()برای ایجاد یک شبکه کامل از آرایه های شاخص استفاده کنید که می تواند در سناریوهای خاص مفید باشد. - از کپی ها در مقابل نماها آگاه باشید: به یاد داشته باشید که نمایه سازی فانتزی و نمایه سازی بولی معمولاً کپی ها را برمی گردانند، نه نماهای داده های اصلی.
نتیجه گیری
تکنیک های نمایه سازی آرایه پیشرفته NumPy، یعنی نمایه سازی بولی و نمایه سازی فانتزی، برای انجام انتخاب و دستکاری پیچیده داده ها در پایتون اساسی هستند. آنها به دانشمندان داده، تحلیلگران و محققان در سراسر جهان این امکان را می دهند که دقیقاً داده های مورد نیاز خود را استخراج کنند و بینش های عمیق تر و تجزیه و تحلیل های قوی تر را ممکن می سازند. با تسلط بر این تکنیک ها، می توانید قدرت کامل NumPy را برای پروژه های داده محور خود باز کنید و به پیشرفت در زمینه هایی از امور مالی جهانی و تحقیقات آب و هوا گرفته تا پزشکی شخصی و هوش مصنوعی کمک کنید. به کاوش، آزمایش و ادغام این روش های انتخاب قدرتمند در گردش کار NumPy خود ادامه دهید.