Cómo convertir una matriz Numpy 2D con tipo de objeto en una matriz 2D regular de flotadores

Como parte de un progtwig más amplio en el que estoy trabajando, terminé con matrices de objetos con cadenas, coordenadas 3D, etc., todo mezclado. Sé que las matrices de objetos pueden no ser las más favoritas en comparación con las matrices estructuradas, pero espero evitar esto sin cambiar muchos códigos.

Supongamos que cada fila de mi matriz obj_array (con N filas) tiene formato de

Single entry/object of obj_array: ['NAME',[10.0,20.0,30.0],....] 

Ahora, estoy tratando de cargar esta matriz de objetos y cortar la porción de coordenadas 3D. Hasta aquí, todo funciona bien con solo pedir, digamos por.

 obj_array[:,[1,2,3]] 

Sin embargo, el resultado también es una matriz de objetos y enfrentaré el problema, ya que quiero formar una matriz 2D de flotadores con:

 size [N,3] of N rows and 3 entries of X,Y,Z coordinates 

Por ahora, estoy repitiendo filas y asignando cada fila a una fila de una matriz flotante 2D de destino para solucionar el problema. Me pregunto si hay alguna forma mejor con las herramientas de conversión de matriz de numpy? Probé algunas cosas y no pude evitarlo.

 Centers = np.zeros([N,3]) for row in range(obj_array.shape[0]): Centers[row,:] = obj_array[row,1] 

Gracias

Pequeño problema desagradable … He estado jugando con este ejemplo de juguete:

 >>> arr = np.array([['one', [1, 2, 3]],['two', [4, 5, 6]]], dtype=np.object) >>> arr array([['one', [1, 2, 3]], ['two', [4, 5, 6]]], dtype=object) 

Mi primera suposición fue:

 >>> np.array(arr[:, 1]) array([[1, 2, 3], [4, 5, 6]], dtype=object) 

Pero eso mantiene el tipo de object , así que quizás entonces:

 >>> np.array(arr[:, 1], dtype=np.float) Traceback (most recent call last): File "", line 1, in  ValueError: setting an array element with a sequence. 

Normalmente se puede evitar esto haciendo lo siguiente:

 >>> np.array(arr[:, 1], dtype=[('', np.float)]*3).view(np.float).reshape(-1, 3) Traceback (most recent call last): File "", line 1, in  TypeError: expected a readable buffer object 

Sin embargo, aquí no, lo que era un poco desconcertante Aparentemente, es el hecho de que los objetos en su matriz son listas que arrojan esto, ya que reemplazar las listas con tuplas funciona:

 >>> np.array([tuple(j) for j in arr[:, 1]], ... dtype=[('', np.float)]*3).view(np.float).reshape(-1, 3) array([[ 1., 2., 3.], [ 4., 5., 6.]]) 

Dado que no parece haber ninguna solución completamente satisfactoria, la más fácil es probablemente ir con:

 >>> np.array(list(arr[:, 1]), dtype=np.float) array([[ 1., 2., 3.], [ 4., 5., 6.]]) 

Aunque eso no será muy eficiente, probablemente sea mejor ir con algo como:

 >>> np.fromiter((tuple(j) for j in arr[:, 1]), dtype=[('', np.float)]*3, ... count=len(arr)).view(np.float).reshape(-1, 3) array([[ 1., 2., 3.], [ 4., 5., 6.]]) 

Basado en el ejemplo de juguete de Jaime, creo que puedes hacerlo simplemente usando np.vstack() :

 arr = np.array([['one', [1, 2, 3]],['two', [4, 5, 6]]], dtype=np.object) float_arr = np.vstack(arr[:, 1]).astype(np.float) 

Esto funcionará independientemente de si los elementos ‘numéricos’ de su matriz de objetos son matrices, listas o tuplas numéricas 1D.

Es posible que desee utilizar una matriz estructurada, de modo que cuando necesite acceder a los nombres y los valores de forma independiente, pueda hacerlo fácilmente. En este ejemplo, hay dos puntos de datos:

 x = zeros(2, dtype=[('name','S10'), ('value','f4',(3,))]) x[0][0]='item1' x[1][0]='item2' y1=x['name'] y2=x['value'] 

el resultado:

 >>> y1 array(['item1', 'item2'], dtype='|S10') >>> y2 array([[ 0., 0., 0.], [ 0., 0., 0.]], dtype=float32) 

Ver más detalles: http://docs.scipy.org/doc/numpy/user/basics.rec.html

Esto funciona muy bien trabajando en su matriz para convertir de un objeto a una matriz de flotadores. El procesamiento de números es extremadamente fácil después. Gracias por el último post !!!! Acabo de modificarlo para incluir cualquier tamaño de DataFrame:

 float_arr = np.vstack(arr[:, :]).astype(np.float) 

Este problema generalmente ocurre cuando tiene un conjunto de datos con diferentes tipos, por lo general, fechas en la primera columna más o menos.

Lo que uso para hacer, es almacenar la columna de fecha en una variable diferente; y llevar el rest de la “matriz de características X” a X. Así que tengo fechas y X, por ejemplo.

Luego aplico la conversión a la matriz X como:

X = np.array(list(X[:,:]), dtype=np.float)

Espero poder ayudar!

Esto es mucho más rápido para simplemente convertir su matriz de objetos en una matriz flotante NumPy: arr=np.array(arr, dtype=[('O', np.float)]).astype(np.float) – desde allí no hay bucles , indícalo como lo harías normalmente en una matriz NumPy. Tendría que hacerlo en trozos aunque con sus diferentes tipos de datos arr[:, 1] , arr[:,2] , etc. Tenía el mismo problema con un objeto NumPy tuple devuelto desde una función DLL de C ++: conversión para elementos 17M lleva <2s.