web-dev-qa-db-fra.com

Chargement d'un fichier texte contenant à la fois float et string à l'aide de numpy.loadtxt

J'ai un fichier texte, data.txt, Qui contient:

5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
5.8,2.7,4.1,1.0,Iris-versicolor
6.2,2.2,4.5,1.5,Iris-versicolor
6.4,3.1,5.5,1.8,Iris-virginica
6.0,3.0,4.8,1.8,Iris-virginica

Comment puis-je charger ces données à l'aide de numpy.loadtxt() afin d'obtenir un tableau NumPy après le chargement tel que [['5.1' '3.5' '1.4' '0.2' 'Iris-setosa'] ['4.9' '3.0' '1.4' '0.2' 'Iris-setosa'] ...]?

J'ai essayé

np.loadtxt(open("data.txt"), 'r',
           dtype={
               'names': (
                   'sepal length', 'sepal width', 'petal length',
                   'petal width', 'label'),
               'formats': (
                   np.float, np.float, np.float, np.float, np.str)},
           delimiter= ',', skiprows=0)
23
VeilEclipse

Si vous utilisez np.genfromtxt , vous pouvez spécifier dtype=None, Qui indiquera à genfromtxt de deviner intelligemment le dtype de chaque colonne. Le plus commodément, il vous soulage du burder de spécifier le nombre d'octets requis pour la colonne de chaîne. (L'omission du nombre d'octets, en spécifiant par exemple np.str, Ne fonctionne pas.)

In [58]: np.genfromtxt('data.txt', delimiter=',', dtype=None, names=('sepal length', 'sepal width', 'petal length', 'petal width', 'label'))
Out[58]: 
array([(5.1, 3.5, 1.4, 0.2, 'Iris-setosa'),
       (4.9, 3.0, 1.4, 0.2, 'Iris-setosa'),
       (5.8, 2.7, 4.1, 1.0, 'Iris-versicolor'),
       (6.2, 2.2, 4.5, 1.5, 'Iris-versicolor'),
       (6.4, 3.1, 5.5, 1.8, 'Iris-virginica'),
       (6.0, 3.0, 4.8, 1.8, 'Iris-virginica')], 
      dtype=[('sepal_length', '<f8'), ('sepal_width', '<f8'), ('petal_length', '<f8'), ('petal_width', '<f8'), ('label', 'S15')])

Si vous voulez utiliser np.loadtxt, Alors pour corriger votre code avec des changements minimes, vous pouvez utiliser:

np.loadtxt("data.txt",
   dtype={'names': ('sepal length', 'sepal width', 'petal length', 'petal width', 'label'),
          'formats': (np.float, np.float, np.float, np.float, '|S15')},
   delimiter=',', skiprows=0)

La principale différence consiste simplement à remplacer np.str Par |S15 (Une chaîne de 15 octets).

Notez également que open("data.txt"), 'r' doit être open("data.txt", 'r'). Mais puisque np.loadtxt Peut accepter un nom de fichier, vous n'avez pas vraiment besoin d'utiliser open.

38
unutbu

Il semble que le fait de garder les chiffres et le texte ensemble vous a causé beaucoup de problèmes - si vous décidez de les séparer, ma solution est la suivante:

values = np.loadtxt('data', delimiter=',', usecols=[0,1,2,3])
labels = np.loadtxt('data', delimiter=',', usecols=[4])
18
mauve