2010-07-17 27 views
5

Quiero crear una matriz con dtype=np.object, donde cada elemento es una matriz con un tipo numérico, por ejemplo, int o float. Por ejemplo:matriz de objetos numerados de matrices numéricas

>>> a = np.array([1,2,3]) 
>>> b = np.empty(3,dtype=np.object) 
>>> b[0] = a 
>>> b[1] = a 
>>> b[2] = a 

crea lo que quiero:

>>> print b.dtype 
object 

>>> print b.shape 
(3,) 

>>> print b[0].dtype 
int64 

pero me pregunto si no hay una manera de escribir líneas 3 a 6 en una línea (sobre todo porque puede ser que quiera para concatenar 100 matrices). Probé

>>> b = np.array([a,a,a],dtype=np.object) 

pero esto en realidad convierte todos los elementos para np.object:

>>> print b.dtype 
object 

>>> print b.shape 
(3,) 

>>> print b[0].dtype 
object 

¿Alguien tiene alguna idea de cómo evitar esto?

Respuesta

3

No es exactamente bonita, pero ...

import numpy as np 

a = np.array([1,2,3]) 
b = np.array([None, a, a, a])[1:] 

print b.dtype, b[0].dtype, b[1].dtype 
# object int32 int32 
+0

Esto es agradable y conciso :-) – astrofrog

-1

creo anyarray es lo que necesita aquí:

b = np.asanyarray([a,a,a]) 
>>> b[0].dtype 
dtype('int32') 

no está seguro de lo que sucedió con los otros 32 bits de los enteros sin embargo.

No estoy seguro de si esto ayuda, pero si se agrega otra matriz de una forma diferente, se convierte de nuevo a los tipos que quiera:

import numpy as np 
a = np.array([1,2,3]) 
b = np.array([1,2,3,4]) 
b = np.asarray([a,b,a], dtype=np.object) 
print(b.dtype) 
>>> object 
print(b[0].dtype) 
>>> int32 
+0

Debe ser mi python ejecutándose en 32 bits. – SiggyF

+2

Eso no parece funcionar, ya que b.dtype es de tipo np.int64, no np.object. – astrofrog

0

no puedo encontrar ninguna solución elegante, pero al menos una mayor solución general a hacer todo a mano es declarar una función de la forma:

def object_array(*args): 
    array = np.empty(len(args), dtype=np.object) 
    for i in range(len(args)): 
     array[i] = args[i] 
    return array 

yo, pues, haría:

a = np.array([1,2,3]) 
b = object_array(a,a,a) 

entonces consigo:

>>> a = np.array([1,2,3]) 
>>> b = object_array(a,a,a) 
>>> print b.dtype 
object 
>>> print b.shape 
(3,) 
>>> print b[0].dtype 
int64 
2
a = np.array([1,2,3]) 
b = np.empty(3, dtype='O') 
b[:] = [a] * 3 

debería ser suficiente.

Cuestiones relacionadas