2010-04-14 6 views
0

Je voudrais convertir une liste de tableaux d'enregistrement - DTYPE est (uint32, float32) - dans un tableau numpy de DTYPE np.object:stockant les tableaux d'enregistrement dans des tableaux d'objets

X = np.array(instances, dtype = np.object) 

instances est un liste des tableaux avec le type de données np.dtype([('f0', '<u4'), ('f1', '<f4')]). Cependant, les résultats de l'instruction ci-dessus dans un tableau dont les éléments sont également de type np.object:

X[0] 
array([(67111L, 1.0), (104242L, 1.0)], dtype=object) 

Quelqu'un sait-il pourquoi?

La déclaration suivante devrait être équivalent à ce qui précède, mais donne le résultat souhaité:

X = np.empty((len(instances),), dtype = np.object) 
X[:] = instances 
X[0] 
array([(67111L, 1.0), (104242L, 1.0), dtype=[('f0', '<u4'), ('f1', '<f4')]) 

grâce & meilleures salutations, Peter

Répondre

1

Stéfan van der Walt (un développeur numpy) explains:

Le constructeur ndarray fait de son mieux pour deviner quel type de données vous êtes alimentation, mais parfois, il a besoin d'un peu d'aide ....

Je préfère construire des tableaux explicitement, donc il n'y a aucun doute ce qui se passe sous le capot:

Lorsque vous dire quelque chose comme

instance1=np.array([(67111L,1.0),(104242L,1.0)],dtype=np.dtype([('f0', '<u4'), ('f1', '<f4')])) 
instance2=np.array([(67112L,2.0),(104243L,2.0)],dtype=np.dtype([('f0', '<u4'), ('f1', '<f4')])) 
instances=[instance1,instance2] 
Y=np.array(instances, dtype = np.object) 

np.array est forcé de deviner quelle est la dimension du tableau que vous désirez. instances est une liste de deux objets, chacun d'une longueur 2. Donc, tout à fait raisonnable, np.array devine que Y devrait avoir la forme (2,2):

print(Y.shape) 
# (2, 2) 

Dans la plupart des cas, je pense que c'est ce qui serait voulu. Cependant, dans votre cas, puisque ce n'est pas ce que vous désirez, vous devez construire le tableau explicitement:

X=np.empty((len(instances),), dtype = np.object) 
print(X.shape) 
# (2,) 

Maintenant, il n'y a pas de question sur la forme de X: (2,) et donc quand vous nourrissez dans les données

X[:] = instances 

numpy est assez intelligent pour considérer instances comme une séquence de deux objets.