2010-07-17 25 views
5

Voglio creare una matrice con dtype=np.object, in cui ogni elemento è una matrice con un tipo numerico, ad esempio int o float. Per esempio:Matrice di oggetti Numpy di matrici numeriche

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

crea ciò che voglio:

>>> print b.dtype 
object 

>>> print b.shape 
(3,) 

>>> print b[0].dtype 
int64 

ma mi chiedo se non ci sia un modo per scrivere le linee 3-6 in una linea (tanto più che potrei desiderare di concatenare 100 matrici). Ho provato

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

, ma questo in realtà converte tutti gli elementi per np.object:

>>> print b.dtype 
object 

>>> print b.shape 
(3,) 

>>> print b[0].dtype 
object 

Qualcuno ha qualche idea su come evitare questo?

risposta

3

Non è esattamente bella, ma ...

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

Questo è bello e conciso :-) – astrofrog

-1

Penso anyarray è quello che serve qui:

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

non so cosa sia successo agli altri 32bit degli interi però.

Non sono sicuro se aiuta, ma se si aggiunge un altro array di forma diversa, si converte di nuovo ai tipi che si desidera:

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

Questo deve essere il mio python in esecuzione a 32 bit. – SiggyF

+2

Sembra non funzionare, poiché b.dtype è di tipo np.int64, non np.object. – astrofrog

0

non riesco a trovare alcuna soluzione elegante, ma almeno un altro soluzione generale a fare tutto a mano è quella di dichiarare una funzione della 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 

posso poi fare:

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

Allora ottengo:

>>> 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 

dovrebbe essere sufficiente.

Problemi correlati