Estoy intentando agrupar una matriz numpy en un tamaño más pequeño tomando el promedio de los elementos. Tales como tomar promedio de sub-arrays 5x5 foreach en una matriz de 100x100 para crear una matriz de tamaño de 20x20. Como tengo que manipular una gran cantidad de datos, ¿es una forma eficiente de hacerlo?Agrupación de matriz numpy 2D en promedio
Respuesta
He intentado esto de gama más pequeña, así que probarlo con la suya:
import numpy as np
nbig = 100
nsmall = 20
big = np.arange(nbig * nbig).reshape([nbig, nbig]) # 100x100
small = big.reshape([nsmall, nbig//nsmall, nsmall, nbig//nsmall]).mean(3).mean(1)
Un ejemplo de 6x6 -> 3x3:
nbig = 6
nsmall = 3
big = np.arange(36).reshape([6,6])
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
small = big.reshape([nsmall, nbig//nsmall, nsmall, nbig//nsmall]).mean(3).mean(1)
array([[ 3.5, 5.5, 7.5],
[ 15.5, 17.5, 19.5],
[ 27.5, 29.5, 31.5]])
Esto es muy sencillo, aunque me siento como que podría ser más rápido:
from __future__ import division
import numpy as np
Norig = 100
Ndown = 20
step = Norig//Ndown
assert step == Norig/Ndown # ensure Ndown is an integer factor of Norig
x = np.arange(Norig*Norig).reshape((Norig,Norig)) #for testing
y = np.empty((Ndown,Ndown)) # for testing
for yr,xr in enumerate(np.arange(0,Norig,step)):
for yc,xc in enumerate(np.arange(0,Norig,step)):
y[yr,yc] = np.mean(x[xr:xr+step,xc:xc+step])
También podría encontrar scipy.signal.decimate interesante. Aplica un filtro de paso bajo más sofisticado que el promedio simple antes de reducir el muestreo de los datos, aunque tendría que diezmar un eje y luego el otro.
media de una matriz 2D sobre subconjuntos de tamaño NxN:
height, width = data.shape
data = average(split(average(split(data, width // N, axis=1), axis=-1), height // N, axis=1), axis=-1)
¡Bonito! Solo una aclaración de que el promedio y la división son funciones numpy. – MonkeyButter
Tenga en cuenta que eumiro's approach no funciona para matrices enmascarados como .mean(3).mean(1)
como Sumes que cada media a lo largo del eje 3 se calculó a partir del mismo número de valores. Si hay elementos enmascarados en su matriz, esta suposición ya no se cumple. En ese caso, debe realizar un seguimiento del número de valores utilizados para calcular .mean(3)
y reemplazar .mean(1)
por una media ponderada. Los pesos son el número normalizado de valores utilizados para calcular .mean(3)
.
Aquí es un ejemplo:
import numpy as np
def gridbox_mean_masked(data, Nbig, Nsmall):
# Reshape data
rshp = data.reshape([Nsmall, Nbig//Nsmall, Nsmall, Nbig//Nsmall])
# Compute mean along axis 3 and remember the number of values each mean
# was computed from
mean3 = rshp.mean(3)
count3 = rshp.count(3)
# Compute weighted mean along axis 1
mean1 = (count3*mean3).sum(1)/count3.sum(1)
return mean1
# Define test data
big = np.ma.array([[1, 1, 2],
[1, 1, 1],
[1, 1, 1]])
big.mask = [[0, 0, 0],
[0, 0, 1],
[0, 0, 0]]
Nbig = 3
Nsmall = 1
# Compute gridbox mean
print gridbox_mean_masked(big, Nbig, Nsmall)
- 1. matriz numpy promedio pero conserva la forma
- 2. Convertir una matriz 1D en una matriz 2D en numpy
- 3. Contruir matriz 3D en numpy desde la matriz 2d existente
- 4. Convertir una matriz numpy 2D en una matriz estructurada
- 5. matriz Numpy 2D Resta por fila
- 6. serie de división 2D de matriz 3D en numpy
- 7. Cómo convertir la matriz numpy flotante 2D a 2D int numpy array?
- 8. numpy - 2d indexación de matrices
- 9. Rotar numpy 2D array
- 10. Identificar regiones contiguas en la matriz numpy 2D
- 11. eficiente gama de construcción Numpy 2D de la matriz 1D
- 12. Cómo truncar los valores de una matriz numpy 2D
- 13. Unir dos matrices numpy 2D en una única matriz 2D de 2 tuplas
- 14. Convierta una lista de matrices numpy 2D en una matriz numpy 3D?
- 15. Funciones de mapeo de matrices numpy 2D
- 16. convertir un diccionario 2d a una matriz numpy
- 17. Intersección de ndarrays 2D numpy
- 18. cómo convertir 2d list a 2d numpy array?
- 19. agrupación jerárquica en correlaciones en Python scipy/numpy?
- 20. ¿Ver en una matriz numpy?
- 21. cómo hacer de dispersión/agrupación operaciones en numpy
- 22. Insertar una fila en una ubicación específica en una matriz 2d en numpy?
- 23. Encontrar valores faltantes en una matriz numpy
- 24. la comprensión del comportamiento de indexación 2d-matriz booleana raro en numpy
- 25. numpy: invertir una matriz triangular superior
- 26. Inicializando matriz 2D en Python
- 27. ¿Cómo generar audio desde una matriz numpy?
- 28. F # Crear matriz 2D
- 29. Transponer una matriz 2D
- 30. cómo modificar una matriz numpy 2D en ubicaciones específicas sin un bucle?
similares a [esta] (https://stackoverflow.com/questions/18645013/windowed-maximum-in-numpy/18645174#18645174) respuesta tan bien. – Daniel