array python numpy scipy signal-processing resampling

python - array - Disminuye una matriz numpy 1D



numpy reshape (2)

En el caso simple en el que el tamaño de su matriz es divisible por el factor de reducción de muestreo ( R ), puede reshape su matriz y tomar la media a lo largo del nuevo eje:

import numpy as np a = np.array([1.,2,6,2,1,7]) R = 3 a.reshape(-1, R) => array([[ 1., 2., 6.], [ 2., 1., 7.]]) a.reshape(-1, R).mean(axis=1) => array([ 3. , 3.33333333])

En el caso general, puede rellenar su matriz con NaN s a un tamaño divisible por R , y tomar la media usando scipy.nanmean .

import math, scipy b = np.append(a, [ 4 ]) b.shape => (7,) pad_size = math.ceil(float(b.size)/R)*R - b.size b_padded = np.append(b, np.zeros(pad_size)*np.NaN) b_padded.shape => (9,) scipy.nanmean(b_padded.reshape(-1,R), axis=1) => array([ 3. , 3.33333333, 4.])

Tengo una matriz numpy 1-d que me gustaría reducir la muestra. Cualquiera de los siguientes métodos es aceptable si el ráster de muestreo descendente no se ajusta perfectamente a los datos:

  • superposición de intervalos de muestras
  • convierta cualquier número de valores que quede al final en un valor separado de submuestreo
  • interpolar para encajar raster

básicamente si tengo

1 2 6 2 1

y estoy reduciendo el muestreo por un factor de 3, todos los siguientes están bien:

3 3 3 1.5

O lo que sea una interpolación que me daría aquí.

Sólo estoy buscando la forma más rápida / fácil de hacer esto.

Encontré scipy.signal.decimate , pero eso suena como si diezmara los valores (los elimina según sea necesario y solo deja uno en X). scipy.signal.resample parece tener el nombre correcto, pero no entiendo a dónde van con todo lo relacionado con Fourier en la descripción. Mi señal no es particularmente periódica.

¿Podrías echarme una mano aquí? Esto parece una tarea realmente simple, pero todas estas funciones son bastante complejas ...


Si el tamaño de la matriz no es divisible por el factor de reducción de resolución (R), la reorganización (división) de la matriz se puede hacer utilizando np.linspace seguido de la media de cada subarray.

input_arr = np.arange(531) R = 150 (number of split) split_arr = np.linspace(0, len(input_arr), num=R+1, dtype=int) dwnsmpl_subarr = np.split(input_arr, split_arr[1:]) dwnsmpl_arr = np.array( list( np.mean(item) for item in dwnsmpl_subarr[:-1] ) )