ホームページ >バックエンド開発 >Python チュートリアル >2D NumPy 配列をより小さな 2D 配列にスライスするにはどうすればよいですか?

2D NumPy 配列をより小さな 2D 配列にスライスするにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-10 14:42:02822ブラウズ

How can I Slice a 2D NumPy Array into Smaller 2D Arrays?

NumPy で 2D 配列をより小さな 2D 配列にスライスする

2D 配列として表現された画像やその他のデータを扱う場合、多くの場合、次のことが必要になります。処理または分析のために、それらをより小さな配列にスライスします。 numpy では、これは reshape 操作と swapaxes 操作を組み合わせて使用​​して実現できます。

このアプローチを理解するために、例を考えてみましょう。 2x4 配列 c:

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

があり、それを 2 つの 2x2 配列にスライスしたいとします。最初のブロックは最初の 2 行と最初の 2 列の要素で構成され、2 番目のブロックは残りの要素で構成される必要があることがわかっています。

形状変更操作を使用して、配列を新しい形状に再構成できます。この場合は 2x2x3 です。新しい形状の行と列の数は最初の 2 つの引数として指定され、3 番目の引数 -1 は、変形を有効にするために必要な次元を計算するように numpy に指示します。

c.reshape(2, 2, -1)

swapaxes then行と列を交換して、目的のブロック形式を取得します:

c.reshape(2, 2, -1).swapaxes(1, 2)

最後に、2 番目の再形状を使用して配列を目的の形状に平坦化します:

c.reshape(2, 2, -1).swapaxes(1, 2).reshape(-1, 2, 2)

結果は 2 です。必要に応じて 2x2 配列:

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

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

提供されたコードには、任意のブロック数に対してこのスライス手法を一般化するブロック形状の関数が含まれています:

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

以上が2D NumPy 配列をより小さな 2D 配列にスライスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。