matrices función convert column array python numpy recarray

función - reshape image python



Convertir matriz estructurada a matriz NumPy normal (3)

La respuesta será muy obvia, creo, pero no la veo en este momento.

¿Cómo puedo convertir una matriz de registros a una ndarray normal?

Supongamos que tengo una matriz estructurada simple siguiente:

x = np.array([(1.0, 4.0,), (2.0, -1.0)], dtype=[(''f0'', ''<f8''), (''f1'', ''<f8'')])

entonces quiero convertirlo a:

array([[ 1., 4.], [ 2., -1.]])

Intenté asarray y astype , pero eso no funcionó.

ACTUALIZACIÓN (resuelto: float32 (f4) en lugar de float64 (f8))

Bien, probé la solución de Robert ( x.view(np.float64).reshape(x.shape + (-1,)) ), y con una matriz simple funciona perfectamente. Pero con la matriz que quería convertir, da un resultado extraño:

data = np.array([ (0.014793682843446732, 0.006681123282760382, 0.0, 0.0, 0.0, 0.0008984912419691682, 0.0, 0.013475529849529266, 0.0, 0.0), (0.014793682843446732, 0.006681123282760382, 0.0, 0.0, 0.0, 0.0008984912419691682, 0.0, 0.013475529849529266, 0.0, 0.0), (0.014776384457945824, 0.006656022742390633, 0.0, 0.0, 0.0, 0.0008901208057068288, 0.0, 0.013350814580917358, 0.0, 0.0), (0.011928378604352474, 0.002819152781739831, 0.0, 0.0, 0.0, 0.0012627150863409042, 0.0, 0.018906937912106514, 0.0, 0.0), (0.011928378604352474, 0.002819152781739831, 0.0, 0.0, 0.0, 0.001259754877537489, 0.0, 0.01886274479329586, 0.0, 0.0), (0.011969991959631443, 0.0028706740122288465, 0.0, 0.0, 0.0, 0.0007433745195157826, 0.0, 0.011164642870426178, 0.0, 0.0)], dtype=[(''a_soil'', ''<f4''), (''b_soil'', ''<f4''), (''Ea_V'', ''<f4''), (''Kcc'', ''<f4''), (''Koc'', ''<f4''), (''Lmax'', ''<f4''), (''malfarquhar'', ''<f4''), (''MRN'', ''<f4''), (''TCc'', ''<f4''), (''Vcmax_3'', ''<f4'')])

y entonces:

data_array = data.view(np.float).reshape(data.shape + (-1,))

da:

In [8]: data_array Out[8]: array([[ 2.28080997e-20, 0.00000000e+00, 2.78023241e-27, 6.24133580e-18, 0.00000000e+00], [ 2.28080997e-20, 0.00000000e+00, 2.78023241e-27, 6.24133580e-18, 0.00000000e+00], [ 2.21114197e-20, 0.00000000e+00, 2.55866881e-27, 5.79825816e-18, 0.00000000e+00], [ 2.04776835e-23, 0.00000000e+00, 3.47457730e-26, 9.32782857e-17, 0.00000000e+00], [ 2.04776835e-23, 0.00000000e+00, 3.41189244e-26, 9.20222417e-17, 0.00000000e+00], [ 2.32706550e-23, 0.00000000e+00, 4.76375305e-28, 1.24257748e-18, 0.00000000e+00]])

que es una matriz con otros números y otra forma. ¿Qué hice mal?


El método más simple es probablemente

x.view((float, len(x.dtype.names)))

( float generalmente debe ser reemplazado por el tipo de elementos en x : x.dtype[0] ). Esto supone que todos los elementos tienen el mismo tipo.

Este método le proporciona la versión normal numpy.ndarray en un solo paso (a diferencia de los dos pasos requeridos por el método view(…).reshape(…) .


[~] |5> x = np.array([(1.0, 4.0,), (2.0, -1.0)], dtype=[(''f0'', ''<f8''), (''f1'', ''<f8'')]) [~] |6> x.view(np.float64).reshape(x.shape + (-1,)) array([[ 1., 4.], [ 2., -1.]])


np.array(x.tolist()) array([[ 1., 4.], [ 2., -1.]])

pero tal vez hay un método mejor ...