¿Almacenar diferentes tipos de datos en una matriz NumPy?

Tengo dos matrices diferentes, una con cuerdas y otra con ints. Quiero concatenarlos, en una matriz donde cada columna tiene el tipo de datos original. Mi solución actual para hacer esto (ver más abajo) convierte la matriz completa en dtype = string, lo que parece muy ineficaz en memoria.

combined_array = np.concatenate((A, B), axis = 1)

¿Es posible mutilar dtypes en combined_array cuando A.dtype = string y B.dtype = int ?

Un enfoque podría ser utilizar una matriz de registros . Las “columnas” no serán como las columnas de matrices de números estándar, pero para la mayoría de los casos de uso, esto es suficiente:

 >>> a = numpy.array(['a', 'b', 'c', 'd', 'e']) >>> b = numpy.arange(5) >>> records = numpy.rec.fromarrays((a, b), names=('keys', 'data')) >>> records rec.array([('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4)], dtype=[('keys', '|S1'), ('data', '>> records['keys'] rec.array(['a', 'b', 'c', 'd', 'e'], dtype='|S1') >>> records['data'] array([0, 1, 2, 3, 4]) 

Tenga en cuenta que también puede hacer algo similar con una matriz estándar especificando el tipo de datos de la matriz. Esto se conoce como una ” matriz estructurada “:

 >>> arr = numpy.array([('a', 0), ('b', 1)], dtype=([('keys', '|S1'), ('data', 'i8')])) >>> arr array([('a', 0), ('b', 1)], dtype=[('keys', '|S1'), ('data', ' 

La diferencia es que las matrices de registros también permiten el acceso de atributos a campos de datos individuales. Las matrices estructuradas estándar no lo hacen.

 >>> records.keys chararray(['a', 'b', 'c', 'd', 'e'], dtype='|S1') >>> arr.keys Traceback (most recent call last): File "", line 1, in  AttributeError: 'numpy.ndarray' object has no attribute 'keys' 

Una solución simple: convierta sus datos al tipo de objeto ‘O’

 z = np.zeros((2,2), dtype='U2') o = np.ones((2,1), dtype='O') np.hstack([o, z]) 

crea la matriz:

 array([[1, '', ''], [1, '', '']], dtype=object)