2017-02-07 2 views
0

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.

+1

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

+0

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." _ –

+0

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

Antwort

0

Mit x_train_data = train_data[:1] erstellt eine view in numpy, wie @hpaulj sagte.

Zum Beispiel:

import numpy as np 

x = np.arange(5) 
y = x[:3] 

print(x) # [0 1 2 3 4] 
print(y) # [0 1 2] 

y[0] = 14 # This changes x as well 

print(x) # [14 1 2 3 4] 
print(y) # [14 1 2] 

Auch in normalen Python wäre es ein shallow copy erstellen.

x = [1, [2, 3]] 

y = x[:] 

print(x) # [1, [2, 3]] 
print(y) # [1, [2, 3]] 

y[1].append(7) # changes x as well 

print(x) # [1, [2, 3, 7]] 
print(y) # [1, [2, 3, 7]] 
Verwandte Themen