Mengambil Subarray daripada Numpy Array dengan Langkah/Saiz Langkah yang Diberikan dengan Cekap
Dalam dunia analisis data, selalunya kita perlu mengekstrak subarray dengan khusus langkah atau saiz langkah daripada tatasusunan yang lebih besar. Numpy, perpustakaan Python yang popular untuk operasi berangka, menawarkan beberapa kaedah untuk mencapai ini dengan cekap.
Pernyataan Masalah:
Memandangkan tatasusunan Numpy, kami ingin mengekstrak matriks subarray bagi panjang tetap dengan langkah atau saiz langkah tertentu. Selangkah ialah jarak antara permulaan subarray berturut-turut.
Perbincangan:
Satu cara mudah untuk mencipta subarray adalah dengan mengulangi tatasusunan asal menggunakan gelung untuk . Walaupun pendekatan ini berfungsi, ia boleh menjadi perlahan untuk tatasusunan yang besar.
Pendekatan 1: Penyiaran
Mekanisme penyiaran NumPy membolehkan kami mencipta subarray tanpa gelung. Kita boleh menggunakan fungsi berikut yang mengambil tatasusunan, panjang subarray (L) dan langkah (S):
def broadcasting_app(a, L, S): nrows = ((a.size - L) // S) + 1 return a[S * np.arange(nrows)[:, None] + np.arange(L)]
Penjelasan:
np.arange(nrows) mencipta tatasusunan indeks dengan langkah 1. Dengan mendarab ini dengan S, kita mendapat indeks permulaan bagi setiap subarray. Kami kemudian menyiarkan indeks ini merentasi baris a untuk mendapatkan subarray.
Pendekatan 2: NumPy Strides
Kaedah lain yang cekap menggunakan ciri langkah NumPy. Langkah mewakili bilangan bait antara elemen berturut-turut di sepanjang setiap paksi. Kami boleh menggunakan maklumat ini untuk mencipta subarray:
def strided_app(a, L, S): nrows = ((a.size - L) // S) + 1 n = a.strides[0] return np.lib.stride_tricks.as_strided(a, shape=(nrows, L), strides=(S * n, n))
Penjelasan:
Kami menggunakan np.lib.stride_tricks.as_strided untuk membentuk semula dengan mengambil kesempatan daripada langkahnya. Tatasusunan yang terhasil mempunyai bilangan baris (nrows) dan panjang subarray (L) yang dikehendaki, sambil mengekalkan langkah S.
Kod Contoh:
Untuk menggambarkan pendekatan:
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) print(broadcasting_app(a, L=5, S=3)) print(strided_app(a, L=5, S=3))
Output:
[[ 1 2 3 4 5] [ 4 5 6 7 8] [ 7 8 9 10 11]] [[ 1 2 3 4 5] [ 4 5 6 7 8] [ 7 8 9 10 11]]
Kedua-dua pendekatan dengan cekap menjana matriks subarray dengan langkah yang diingini.
Atas ialah kandungan terperinci Bagaimana untuk Mengeluarkan Subarrays dengan Cekap dengan Langkah Diberi daripada Susunan NumPy?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!