2016-05-23 9 views
2

Ich habe ein Array von 56 Bildern mit jeweils 2 Kanälen für die Pixel. So ist seine Form (1200, 800, 52, 2). Ich muss einen KNeighborsClassifier tun, und es muss abgeflacht werden, so dass alle Pixel in allen 52 Bildern in einer Spalte sind. Also Form (1200 * 800 * 52,2). Dann, nachdem die Klassifizierung durchgeführt wurde, muss ich wissen, dass ich sie in der richtigen Reihenfolge umformen kann.Unshape und umgestalten ein numpy Array?

Als ersten Schritt versuche ich, das gleiche Array zu entformen und zu verändern und zu versuchen, es so zu machen wie das Original.

Hier ist, was ich habe versucht, die nicht zu funktionieren scheint:

In [55]: Y.shape 
Out[55]: (1200, 800, 2, 52) 

In [56]: k = np.reshape(Y,(1200*800*52,2)) 

In [57]: k.shape 
Out[57]: (49920000, 2) 

In [58]: l = np.reshape(k,(1200,800,52,2)) 

In [59]: l.shape 
Out[59]: (1200, 800, 52, 2) 

In [60]: assert l == Y 
/Users/alex/anaconda2/bin/ipython:1: DeprecationWarning: elementwise == comparison failed; this will raise an error in the future. 
    #!/bin/bash /Users/alex/anaconda2/bin/python.app 
--------------------------------------------------------------------------- 
AssertionError       Traceback (most recent call last) 
<ipython-input-60-9faf5e8e20ba> in <module>() 

Edit: ich einen Fehler in k und Y die Formen. hier ist die korrigierte Version, noch mit einem Fehler, obwohl

In [78]: Y.shape 
Out[78]: (1200, 800, 2, 52) 

In [79]: k = np.reshape(Y,(1200*800*52,2)) 

In [80]: k.shape 
Out[80]: (49920000, 2) 

In [81]: l = np.reshape(k,(1200,800,2,52)) 

In [82]: assert Y == l 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-82-6f6815930213> in <module>() 
----> 1 assert Y == l 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 
+1

'Y' hat Form' (1200, 800, 2, 52) ', aber' L' hat Form '(1200, 800, 52, 2)' die beiden sind nicht gleich, weil die Formen nicht übereinstimmen. – unutbu

+0

oops. Ich habe die Frage und den Code aktualisiert. Ein anderer Fehler tritt auf, aber die Neugestaltung scheint immer noch nicht zu funktionieren. – BigBoy1337

Antwort

1

(Y == l) ist ein boolesches Array mit der gleichen Form wie Y und l.

assert expression wertet expression in einem booleschen Kontext aus. Mit anderen Worten, expression.__bool__() heißt.

konstruktions die ndarray.__bool__ Methode löst

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

, weil nicht klar ist, ob __bool__ sollte True zurück, wenn alle die Elemente True sind, oder wenn jede der Elemente True sind.

Sie können den Fehler vermeiden, indem Sie entweder die Methode all oder any aufrufen, abhängig von Ihrer Absicht. In Ihrem Fall würden Sie behaupten wollen, dass alle Werte gleich sind:

assert (Y == l).all() 

Da schwimmt auf Gleichheit zu vergleichen manchmal unerwartete Ergebnisse aufgrund der Ungenauigkeit der Gleitkomma-Arithmetik zurückkehren kann, verglichen Gleitkomma-Arrays für die Gleichstellung kann auch sicherer mit

assert np.allclose(Y, l) 

Hinweis erfolgen, dass np.allclose relative Toleranz und absolute Toleranz akzeptieren Parameter mit Gleitkommazahlen Unschärfen zu bewältigen.

+0

Das ist richtig. Ich möchte hinzufügen, dass für meinen Fall Y = np.transpose (Y, (3,0,1,2)), um die Form (52,1200,800,2) zu machen. Das macht für mich intuitiver Sinn, als 52 Fälle von 1200 Reihen von 800 Spalten von 2 Kanälen. Dann .any, .all, und .allclose alle behaupteten, gut – BigBoy1337

1

Sieht aus wie Ihre Fehler in Zeile 56 sind, in dem Sie ein reshape verwenden, die nicht den ursprünglichen Dimensionen Y (letzte Achse 52 folgen, aber Sie umgestalten wie es war 2).

Vielleicht sollten Sie

k = np.reshape(Y,(1200*800*2,52)) 

versuchen, da es besser mit der Idee zu reflektieren scheint „52 Bilder abgeflacht“.

+0

Nun, ich möchte flachere Pixelwerte. Die "2" ist für a und b Farbkanäle.Ich denke, das wäre in diesem Fall verloren. – BigBoy1337