La conversion 2D tableau numpy à un tableau structuré
Je suis en train de convertir un tableau à deux dimensions dans une structure de tableau avec le nom des champs. Je veux que chaque ligne dans le tableau 2D à un nouveau record dans la structure du tableau. Malheureusement, rien, j'ai essayé de travail est la façon dont je l'attends.
Je commence avec:
>>> myarray = numpy.array([("Hello",2.5,3),("World",3.6,2)])
>>> print myarray
[['Hello' '2.5' '3']
['World' '3.6' '2']]
Je veux convertir à quelque chose qui ressemble à ceci:
>>> newarray = numpy.array([("Hello",2.5,3),("World",3.6,2)], dtype=[("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[('Hello', 2.5, 3L) ('World', 3.6000000000000001, 2L)]
Ce que j'ai essayé:
>>> newarray = myarray.astype([("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[[('Hello', 0.0, 0L) ('2.5', 0.0, 0L) ('3', 0.0, 0L)]
[('World', 0.0, 0L) ('3.6', 0.0, 0L) ('2', 0.0, 0L)]]
>>> newarray = numpy.array(myarray, dtype=[("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[[('Hello', 0.0, 0L) ('2.5', 0.0, 0L) ('3', 0.0, 0L)]
[('World', 0.0, 0L) ('3.6', 0.0, 0L) ('2', 0.0, 0L)]]
Ces deux approches tentent de convertir chaque entrée dans myarray dans un dossier avec le dtype, de sorte que les zéros supplémentaires sont insérées. Je ne peux pas comprendre comment l'obtenir pour la conversion de chaque ligne dans un enregistrement.
Une autre tentative:
>>> newarray = myarray.copy()
>>> newarray.dtype = [("Col1","S8"),("Col2","f8"),("Col3","i8")]
>>> print newarray
[[('Hello', 1.7219343871178711e-317, 51L)]
[('World', 1.7543139673493688e-317, 50L)]]
Cette fois, aucune conversion n'est effectuée. Les données existantes dans la mémoire est tout simplement ré-interprété comme le nouveau type de données.
Le tableau que je suis en commençant par la lecture à partir d'un fichier texte. Les types de données ne sont pas connues à l'avance, donc je ne peux pas définir le dtype au moment de la création. J'ai besoin d'une haute performance et élégant qui va bien travailler pour les cas généraux depuis que je vais faire ce type de conversion beaucoup, beaucoup de fois pour une large variété d'applications.
Merci!
Vous devez vous connecter pour publier un commentaire.
Vous pouvez "créer un tableau d'enregistrements à partir d'un (plat) liste des tableaux" à l'aide de numpy.de base.les enregistrements.fromarrays comme suit:
J'ai essayé de faire quelque chose de similaire. J'ai constaté que lorsque numpy créé un tableau structuré à partir d'un tableau 2D (à l'aide de np.de base.les enregistrements.fromarrays), elle a considéré que chaque colonne (au lieu de chaque ligne) dans le 2-D tableau comme un record. Donc, vous avez à le transposer. Ce comportement de numpy ne semble pas très intuitif, mais il est peut-être une bonne raison pour cela.
fromrecords
vous pouvez éviter latranspose()
Je suppose que
est ce que vous voulez.
Si les données démarre comme une liste de tuples, puis la création d'un tableau structuré est simple:
La complication ici, c'est que la liste de tuples a été tourné en 2d tableau de chaînes:
Nous pourrions utiliser le bien connu
zip*
approche de la "transposition" ce tableau - en fait, nous voulons une double transposition:zip
a idéalement nous a donné une liste de tuples. Maintenant, nous pouvons recréer le tableau avec désiré dtype:Accepté la réponse utilise
fromarrays
:En interne,
fromarrays
prend une communerecfunctions
approche: créer de la matrice cible, et de copier les valeurs par nom de champ. Effectivement il n':Bon, j'ai été aux prises avec ce pour un certain temps maintenant, mais j'ai trouvé un moyen de faire ce que ne pas prendre trop d'effort. Je m'excuse si ce code est "sale"....
Commençons avec un tableau 2D:
On se retrouve donc avec un tableau 2D avec 4 colonnes et 5 lignes:
Utilisation de numpy.de base.les enregistrements.tableaux - nous besoin pour fournir l'entrée en argument une liste de tableaux donc:
Cela produit un tableau séparé par rangée de données, MAIS, nous avons besoin de la contribution des matrices à par colonne, de sorte à ce que nous allons avoir besoin:
Enfin, il doit être une liste de tableaux, et pas un n-uplet, de sorte que nous envelopper le ci-dessus dans la liste() comme ci-dessous:
C'est notre entrée de données argument de tri.... la prochaine est le dtype:
Bon, alors maintenant, nous pouvons passer que pour la numpy.de base.les enregistrements.array():
... et je croise les doigts:
Le tour est joué! Vous pouvez index par nom de colonne comme dans:
J'espère que cette aide que j'ai perdu autant de temps avec numpy.asarray et mydata.astype etc en essayant d'obtenir que cela fonctionne avant de finalement de travail de cette méthode.