18 Stimmen

Entfernen Sie dtype am Ende des numpy-Arrays

Ich schreibe eine Methode, um ein Array aus einer Datendatei zu erstellen. Die Methode sieht so aus:

import numpy
def readDataFile(fileName):
    try:
        with open(fileName, 'r') as inputs:
            data = None
            for line in inputs:
                line = line.strip()
                items = line.split('\t')
                if data == None:
                    data = numpy.array(items[0:len(items)]) 
                else:
                    data = numpy.vstack((data, items[0:len(items)]))
                return numpy.array(data)
    except IOError as ioerr:
        print 'IOError: ', ioerr
        return None

Meine Daten-Datei enthält Zeilen von Zahlen, die jeweils durch ein Tab getrennt sind, z.B.:

1 2 3
4 5 6
7 8 9

Und ich erwarte, ein Array wie folgt zu erhalten:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

Jedoch enthält das Ergebnis dtype am Ende:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]], dtype='|S9')

Wegen dem kann ich einige Operationen auf dem Ergebnis nicht durchführen, z.B. wenn ich versuche, den Maximalwert für jede Zeile zu finden, indem ich result.max(0) verwende, erhalte ich einen Fehler:

TypeError: cannot perform reduce with flexible type.

Kann mir also jemand sagen, was mit meinem Code falsch ist und wie ich es beheben kann? Vielen Dank.

15voto

Numpy-Array in Python bietet eine Methode, um diese Aufgabe zu erledigen:

import numpy as np
a = np.array(['A', 'B'])
a
# Gibt aus: array(['A', 'B'],  dtype='|S1')

a.tolist()
# Gibt aus ['A', 'B']

http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tolist.html#numpy.ndarray.tolist

12voto

Bi Rico Punkte 24493

Der einfachste Fix besteht darin, numpy's loadtxt zu verwenden:

data = numpy.loadtxt(fileName, dtype='float')

Nur zur Information, die Verwendung von numpy.vstack innerhalb einer Schleife ist keine gute Idee. Wenn Sie sich entscheiden, loadtxt nicht zu verwenden, können Sie Ihre Schleife durch Folgendes ersetzen, um das dtype-Problem zu beheben und das numpy.vstack zu eliminieren.

data = [row.split('\t') for row in inputs]
data = np.array(data, dtype='float')

Update

Immer wenn vstack aufgerufen wird, wird ein neues Array erstellt und der Inhalt der alten Arrays in das neue kopiert. Diese Kopie ist ungefähr O(n), wobei n die Größe des Arrays ist, und wenn Ihre Schleife n-mal durchläuft, wird das Ganze zu O(n**2), mit anderen Worten langsam. Wenn Sie die endgültige Größe des Arrays im Voraus kennen, ist es besser, das Array außerhalb der Schleife zu erstellen und das vorhandene Array zu füllen. Wenn Sie die endgültige Größe des Arrays nicht kennen, können Sie eine Liste innerhalb der Schleife verwenden und am Ende vstack aufrufen. Zum Beispiel:

import numpy as np
myArray = np.zeros((10,3))
for i in xrange(len(myArray)):
    myArray[i] = [i, i+1, i+2]

# oder:
myArray = []
for i in xrange(10):
    myArray.append(np.array([i, i+1, i+2]))
myArray = np.vstack(myArray)

11voto

Akavall Punkte 75208

So ändern Sie Datentypen in numpy:

>>> x
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> x.astype('|S9')
array([['1', '2', '3'],
       ['4', '5', '6'],
       ['7', ' '8', '9']], 
      dtype='|S9')
>>> x.astype('Float64')
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.],
       [ 7.,  8.,  9.]])
>>> x.astype('int')
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

3voto

... Hast du versucht, sie zuerst in Zahlen umzuwandeln?

items = [int(x) for x in line.split('\t')]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X