ich eine Liste von Listen erstellt (jede Reihe 784 Elemente) - dies ist 28x28 BilddatenmatrixPython - nicht sicher, warum zwei Listen suchen das gleiche (ein in der Funktion aktualisiert wird)
train_data, train_labels = X[:60000], Y[:60000]
Zum Verwischen der Bilder - hier sind zwei Funktionen, die einen neuen Wert jedes Pixel berechnen - Durchschnitt basierend auf 8 benachbarten Elementen in der 28x28 Matrix (ignorierte erste/letzte Zeile und erste/letzte Spalte zur Vereinfachung, dh Schleife von 2-26 statt 0 -27)
def new_func(x_train_data,train_data):
for index in range(x_train_data.shape[0]):
imgvector = x_train_data[index].reshape(28, 28)
for iblur in range(2, 27):
for jblur in range(2, 27):
imgvector[iblur][jblur] = getNewVaueofPixel(imgvector, iblur, jblur)
print "blurring complete"
x_train_data[index] = imgvector.reshape(1, 784)
print np.array_equal(x_train_data[index], train_data)
def getNewVaueofPixel(imgvector, iblur, jblur):
pixelval = 0.0
for ib in range(-1, 2):
for jb in range(-1, 2):
pixelval = pixelval + imgvector[iblur + ib][jblur + jb]
outval = round(pixelval/8.0, 12)
return ('{:.12f}'.format(outval)).rstrip('0') or 0.
Hier ist der Funktionsaufruf:
Unter Zeile in der Funktion gibt True zurück, aber wenn ich auf den Wert von x_train_data [Index] schaue, ist es nicht das gleiche wie Original und wurde korrekt aktualisiert.
print np.array_equal(x_train_data[index], train_data)
Ich habe mehr als 12 Stunden Debuggen verbracht, aber nicht überall. Kann einfach nicht verstehen, warum ist train_data aktualisiert wird, wenn
x_train_data = train_data[:1]
soll eine Kopie der Liste und keinen Verweis darauf erstellen. Schätze jede Hilfe.
Wenn 'train_data' ist ein' numpy.array', anstatt eine Liste (Listen), '[1]' erstellt eine 'view', keine Kopie. Sie müssen sich vielleicht über grundlegende numpy Arrays informieren (neue 'sckit-learn' Benutzer scheinen hineinzuspringen, ohne viel über' numpy' zu wissen, obwohl das Kit auf diesem Paket aufgebaut ist.). Innerhalb Ihrer Funktion hat 'x_train_data' ein' shape' Attribut, als sicheres Zeichen dafür, dass es sich um ein Array und nicht um eine Liste handelt. – hpaulj
Selbst im normalen Python würde die Verwendung von [: 1] [eine flache Kopie] erzeugen (https://docs.python.org/3.4/library/copy.html). Das heißt: "Eine flache Kopie erstellt ein neues zusammengesetztes Objekt und fügt dann (soweit möglich) Referenzen in die Objekte ein, die im Original gefunden wurden." _ –
danke @Fermiparadox und @hpaulj! Ich denke, ich muss ein neues Array von Nullen einrichten und die Werte darin aktualisieren. Wird auf numpy.arrarys nachlesen. – hyperloopfan