Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mengeluarkan Subarrays dengan Cekap dengan Langkah Diberi daripada Susunan NumPy?

Bagaimana untuk Mengeluarkan Subarrays dengan Cekap dengan Langkah Diberi daripada Susunan NumPy?

Patricia Arquette
Patricia Arquetteasal
2024-12-09 21:18:10830semak imbas

How to Efficiently Extract Subarrays with a Given Stride from a NumPy Array?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn