Comment sous-échantillonner une matrice en faisant la moyenne sur n * n éléments avec numpy en python ?

Published: 04 mars 2021

Tags: Python; Numpy;

DMCA.com Protection Status

Exemples de comment sous-échantillonner une matrice en faisant la moyenne sur n * n éléments avec numpy en python:

Créer une matrice

Créons d'abord une simple avec numpy:

Note: voir aussi la note how to upsample an array by repeating elements using numpy in python

import numpy as np

a = np.array([[0,1], [2,3]])
a = np.kron(a, np.ones((3,3)))

print(a)

donne

[[0. 0. 0. 1. 1. 1.]
 [0. 0. 0. 1. 1. 1.]
 [0. 0. 0. 1. 1. 1.]
 [2. 2. 2. 3. 3. 3.]
 [2. 2. 2. 3. 3. 3.]
 [2. 2. 2. 3. 3. 3.]]

et

print(a.shape)

donne

(6, 6)

Sous-échantillonner la matrice a en faisant la moyenne sur 2 * 2 éléments

Exemple de sous-échantillonnage en faisant la moyenne de 2 par 2 éléments dans la matrice a:

n = 2
b = a.shape[0]//n

a_downsampled = a.reshape(-1, n, b, n).sum((-1, -3)) / n

print(a_downsampled)

donne

[[0. 1. 2.]
 [2. 3. 4.]
 [4. 5. 6.]]

Utilisation d'une convolution 2D

Un autre exemple en utilisant cette fois scipy.signal.convolve2d

from scipy.signal import convolve2d

kernel = np.ones((n, n))
convolved = convolve2d(a, kernel, mode='valid')
a_downsampled = convolved[::n, ::n] / n

print(a_downsampled)

donne:

[[0. 1. 2.]
 [2. 3. 4.]
 [4. 5. 6.]]

Références