Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menghiris Tatasusunan 2D kepada Tatasusunan 2D yang Lebih Kecil dengan NumPy?

Bagaimana untuk Menghiris Tatasusunan 2D kepada Tatasusunan 2D yang Lebih Kecil dengan NumPy?

DDD
DDDasal
2024-11-07 16:21:02601semak imbas

How to Slice a 2D Array into Smaller 2D Arrays with NumPy?

Menghiris Tatasusunan 2D kepada Tatasusunan 2D yang Lebih Kecil dengan Numpy

Selalunya, ia menjadi perlu untuk memisahkan tatasusunan 2D kepada tatasusunan 2D yang lebih kecil. Sebagai contoh, pertimbangkan tugas membahagikan tatasusunan 2x4 kepada dua tatasusunan 2x2.

Penyelesaian:

Gabungan bentuk semula dan fungsi swapax terbukti berkesan dalam senario ini:

import numpy as np

def blockshaped(arr, nrows, ncols):
    """
    Converts a 2D array into a 3D array with smaller subblocks.
    """
    h, w = arr.shape
    assert h % nrows == 0, f"{h} rows is not divisible by {nrows}"
    assert w % ncols == 0, f"{w} columns is not divisible by {ncols}"

    return (arr.reshape(h//nrows, nrows, -1, ncols)
               .swapaxes(1,2)
               .reshape(-1, nrows, ncols))

Contoh Penggunaan:

Pertimbangkan tatasusunan berikut:

c = np.arange(24).reshape((4, 6))
print(c)

Output:

[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

Menghiris ini tatasusunan menjadi blok yang lebih kecil:

print(blockshaped(c, 2, 3))

Output:

[[[ 0  1  2]
  [ 6  7  8]]

 [[ 3  4  5]
  [ 9 10 11]]

 [[12 13 14]
  [18 19 20]]

 [[15 16 17]
  [21 22 23]]]

Nota Tambahan:

  • Fungsi unblockshaped boleh digunakan untuk terbalikkan penghirisan.
  • Pandangan blockwise_view Superbatfish menyediakan alternatif dengan format tersendiri.

Atas ialah kandungan terperinci Bagaimana untuk Menghiris Tatasusunan 2D kepada Tatasusunan 2D yang Lebih Kecil dengan 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