NumPy: obtener min / max de la matriz de registros de valores numéricos

Tengo una matriz de registros NumPy de flotadores:

import numpy as np ar = np.array([(238.03, 238.0, 237.0), (238.02, 238.0, 237.01), (238.05, 238.01, 237.0)], dtype=[('A', 'f'), ('B', 'f'), ('C', 'f')]) 

¿Cómo puedo determinar el mínimo / máximo de esta matriz de registros? Mi bash habitual de ar.min() falla con:

TypeError: no se puede realizar reducir con el tipo flexible

No estoy seguro de cómo aplanar los valores en una matriz NumPy más simple.

La forma más fácil y eficiente es probablemente ver su matriz como una simple matriz 2D de flotadores :

 ar_view = ar.view((ar.dtype[0], len(ar.dtype.names))) 

que es una vista de matriz 2D en la matriz estructurada:

 print ar_view.min(axis=0) # Or whatever… 

Este método es rápido, ya que no se crea una nueva matriz (los cambios en ar_view provocan cambios en ar ). Sin embargo, está restringido a casos como el suyo, donde todos los campos de registro tienen el mismo tipo (float32, aquí).

Una ventaja es que este método mantiene intacta la estructura 2D de la matriz original: puede encontrar el mínimo en cada “columna” ( axis=0 ), por ejemplo.

tu puedes hacer

 # construct flattened ndarray arnew = np.hstack(ar[r] for r in ar.dtype.names) 

para aplanar la recuperación, entonces puede realizar sus operaciones normales de ndarray, como

 armin, armax = np.min(arnew), np.max(arnew) print(armin), print(armax) 

los resultados son

 237.0 238.05 

básicamente ar.dtype.names te da la lista de nombres de recarray, luego recuperas el array uno por uno desde los nombres y la stack para arnew a arnew

Esto puede ayudar a alguien más en la línea, pero es otra forma de hacerlo que puede ser más sensata:

 import numpy as np ar = np.array([(238.03, 238.0, 237.0), (238.02, 238.0, 237.01), (238.05, 238.01, 237.0)], dtype=[('A', 'f'), ('B', 'f'), ('C', 'f')]) arView = ar.view(np.recarray) arView.A.min() 

Lo que me permitió simplemente escoger y elegir. Un problema de mi parte fue que el tipo de dtype para todos mis elementos no era el mismo (una estructura bastante complicada en general).