Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mengekstrak Subarray dengan Cekap dengan Strides dalam NumPy?

Bagaimana untuk Mengekstrak Subarray dengan Cekap dengan Strides dalam NumPy?

Barbara Streisand
Barbara Streisandasal
2024-12-03 18:05:16373semak imbas

How to Efficiently Extract Subarrays with Strides in NumPy?

Pengekstrakan Subarray dengan Langkah dalam Tatasusunan Numpy

Pertimbangkan tatasusunan Python Numpy a:

a = numpy.array([1,2,3,4,5,6,7,8,9,10,11])

Kami berhasrat untuk ekstrak subarrays panjang 5 dengan langkah 3. Ini menghasilkan matriks dengan yang berikut kandungan:

numpy.array([[1,2,3,4,5],[4,5,6,7,8],[7,8,9,10,11]])

Pelaksanaan Lebih Bersih

Walaupun pendekatan untuk gelung berdaya maju, Numpy menyediakan kaedah yang lebih cekap:

Pendekatan 1: Penyiaran

Pendekatan ini mengambil kesempatan penyiaran:

def broadcasting_app(a, L, S ):  # Window len = L, Stride len/stepsize = S
    nrows = ((a.size-L)//S)+1
    return a[S*np.arange(nrows)[:,None] + np.arange(L)]

Pendekatan 2: Pengoptimuman Langkah

Kaedah ini menggunakan langkah cekap Numpy:

def strided_app(a, L, S ):  # Window len = L, Stride len/stepsize = 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))

Contoh Penggunaan:

a = numpy.array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

broadcasting_app(a, L = 5, S = 3)
# [[ 1  2  3  4  5]
#  [ 4  5  6  7  8]
#  [ 7  8  9 10 11]]

strided_app(a, L = 5, S = 3)
# [[ 1  2  3  4  5]
#  [ 4  5  6  7  8]
#  [ 7  8  9 10 11]]

Ini pendekatan menawarkan penyelesaian yang lebih cekap dan dioptimumkan untuk mengekstrak subarray dengan langkah dalam tatasusunan Numpy.

Atas ialah kandungan terperinci Bagaimana untuk Mengekstrak Subarray dengan Cekap dengan Strides dalam 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