Tableau NumPy/matrice de différents types
Je suis en train de créer un tableau NumPy/matrice (Nx3) avec un mélange de types de données (string, integer, integer). Mais quand je suis à l'ajout de cette matrice en ajoutant des données, j'obtiens une erreur: TypeError: invalid type de promotion. S'il vous plaît, quelqu'un peut-il m'aider à résoudre ce problème?
Lorsque je crée un tableau avec les données de l'échantillon, NumPy jette toutes les colonnes dans la matrice de la un " S " type de données. Et je ne peux pas spécifier le type de données pour un tableau, parce que quand je fais ce res = np.array(["TEXTE", 1, 1], dtype=S', i4 i4') - j'obtiens une erreur: TypeError: attendu lisible tampon objet
templates.py
import numpy as np
from pprint import pprint
test_array = np.zeros((0, 3), dtype='S, i4, i4')
pprint(test_array)
test_array = np.append(test_array, [["TEXT", 1, 1]], axis=0)
pprint(test_array)
print("Array example:")
res = np.array(["TEXT", 1, 1])
pprint(res)
De sortie:
array([], shape=(0L, 3L),
dtype=[('f0', 'S'), ('f1', '<i4'), ('f2', '<i4')])
Array example:
array(['TEXT', '1', '1'], dtype='|S4')
Erreur:
Traceback (most recent call last):
File "templates.py", line 5, in <module>
test_array = np.append(test_array, [["TEXT", 1, 1]], axis=0)
File "lib\site-packages\numpy\lib\function_base.py", line 3543, in append
return concatenate((arr, values), axis=axis)
TypeError: invalid type promotion
test_array = np.zeros((0,), dtype='S, i4, i4')
produit un tableau avec des 0 'lignes', et 3 nommé "colonnes". C'est vraiment un tableau 1d.- En général, dans
numpy
il n'est pas une bonne idée de construire des tableaux en ajoutant. Il est préférable d'ajouter à une liste, et construire le tableau de cela. Ou de démarrer avec un assez grand "vide", tableau et insérer des valeurs. Ou concaténer des tableaux. - J'ai juste regardé le
append
code. En fait, il utiliseconcatenate
. Essayez de créer un tableau avec le "TEXTE" de données, et de les enchaîner que pourtest_array
.
Vous devez vous connecter pour publier un commentaire.
Votre problème est dans les données. Essayez ceci:
ou
Les données doivent être un tuple ou une liste de tuples. Pas tout à fait évident forme le message d'erreur, s'agit-il?
Aussi, veuillez noter que la longueur du champ de texte doit être spécifié pour les données de texte pour vraiment être sauvé. Si vous souhaitez enregistrer le texte en tant qu'objets (uniquement les références dans le tableau, alors:
C'est souvent très utile, aussi bien.
tuples
sont nécessaires si vous essayeznp.array(("TEXT", 1,1), dtype='S, i4, i4')
contrenp.array(["TEXT", 1,1], dtype='S, i4, i4')
.Si vous n'êtes pas marié à numpy, un les pandas DataFrame est parfait pour cela.
Sinon, vous pouvez spécifier la chaîne de caractères dans le tableau comme un objet python (dtype='O, i4 i4', comme un exemple). Également ajouter semblent comme des listes de n-uplets, pas de listes de listes. Je pense qu'il a quelque chose à voir avec la mutabilité des listes, pas sûr.
D'abord, numpy stocke les éléments du tableau à l'aide de physique fixe les tailles d'enregistrement. Donc, d'enregistrer les objets doivent tous être de la même taille physique. Pour cette raison, vous devez dire à numpy la taille de la chaîne ou d'enregistrer un pointeur vers une chaîne de caractères stockée ailleurs. Dans un tableau d'enregistrements, 'S' est traduit par une chaîne de longueur nulle, et ce n'est probablement pas ce que vous souhaitiez.
La méthode append fait des copies de l'ensemble de la matrice à une plus grande physique de l'espace pour accueillir les nouveaux éléments. Essayez, par exemple:
Chaque fois que vous ajoutez de cette façon, la copie devient plus lent car vous avez besoin d'allouer et de copier plus de mémoire à chaque fois qu'il grandit. C'est pourquoi l'id renvoie une valeur différente à chaque fois que vous ajoutez. Si vous voulez un nombre important d'enregistrements dans votre tableau, vous êtes beaucoup mieux d'allouer suffisamment d'espace dès le début, ou bien l'accumulation de données dans des listes, puis à recueillir la listes en une numpy structuré tableau lorsque vous avez terminé. Que vous donne également la possibilité de faire de la longueur de la chaîne dans mtype aussi court que possible, tout en restant suffisamment long pour contenir votre chaîne la plus longue.
Je pense que c'est ce que vous essayez d'accomplir - créer un tableau vide, de la
dtype
, puis ajouter un ou plusieurs ensembles de données à elle. Le résultat sera à la forme (N,), non (N,3).Comme je l'ai mentionné dans un commentaire,
np.append
utilisenp.concatenate
, si je l'utilise trop. J'ai aussi eu à faire à la foistest_array
etx
tableaux 1d (de la forme (0,) et (1, respectivement). Et ledtype
champ estS10
, assez grand pour contenir "TEXTE".Voici un exemple de construction de la matrice à partir d'une liste de tuples:
Je ne crois pas que vous pouvez faire un tableau de plus d'un type de données. Vous pouvez, cependant, faire une liste avec plus d'un type de données.
donne
dtype
.