konvertieren Ich habe ein Bild als numpy Array mit Werten von 0 und 255 (kein anderer Wert innerhalb des Bereichs). Was ist der beste Weg, um es in 0 und 1 Array zu konvertieren.Wie Array-Werte 0 und 255 zu entsprechenden 0 und 1 Array
Antwort
my_array = np.array([255,255,0,0])
my_array = my_array/255
Will Ausgang
array([ 1., 1., 0., 0.])
Mit anderen Worten, es wird keine normalisiert alle Werte im Bereich von 0-255 arbeiten (obwohl Sie sagen, dass sie die einzigen zwei Werte sind, wird es für alles funktioniert wie auch zwischendurch, während die Verhältnisse zu halten)
können Sie maskieren (entweder mit >0
oder ==255
oder wirklich etwas anderes) dann konvertieren eingeben int
:
npa = np.array([0,255,0,255,255,255,0])
npa
array([ 0, 255, 0, 255, 255, 255, 0])
(npa>0).astype('int')
array([0, 1, 0, 1, 1, 1, 0])
Klingt wie ein Job für numpy.clip
:
>>> a = np.array([0, 255, 0, 255, 255, 0])
>>> a.clip(max=1)
array([0, 1, 0, 1, 1, 0])
Aus der Dokumentation:
ein Intervall gegeben, Werte außerhalb des Intervalls sind auf das Intervall abgeschnitten Kanten. Wenn beispielsweise ein Intervall von [0, 1] angegeben wird, werden Werte kleiner 0 zu 0 und Werte größer als 1 zu 1.
Weil es so viele Antworten gibt, die die richtige Antwort geben, ich einfach wollte die verschiedenen Ansätze testen und entscheiden, welches der beste Rechenaufwand ist. Ich habe den folgenden Code geschrieben, der einen gegebenen Datensatz erstellt, der ein Bild von 0 und 255 Werten ist, zufällig angeordnet, und dann studiere ich die mittlere verstrichene Zeit für jeden vorgeschlagenen Algorithmus, variiere die Anzahl der Pixel des Bildes (beachte, dass ich verwende den Mittelwert das Rauschen in der Messung zu reduzieren):
import numpy as np
import time
times1_all = []
times2_all = []
times3_all = []
for i in xrange(20):
times1 = []
times2 = []
times3 = []
xsizes = np.arange(100,10000,500)
print len(xsizes)
for xsize in xsizes:
#Create the dataset
ysize = xsize
xrand = np.random.randint(0,xsize, xsize)
yrand = np.random.randint(0,ysize, xsize)
a = np.zeros([xsize,ysize])
a[xrand, yrand] = 255
start = time.time()
b = (a == 255).astype('int')
stop = time.time()
time1 = stop-start
start = time.time()
b = a/255
stop = time.time()
time2 = stop-start
start = time.time()
b = a.clip(max=1)
stop = time.time()
time3 = stop-start
print time3
times1.append(time1)
times2.append(time2)
times3.append(time3)
print 'Elapsed times --> (1)/(1)=%.2f, (2)/(1)=%.2f, (3)/(1)=%.2f' %(time1/time1,time2/time1,time3/time1)
times1_all.append(times1)
times2_all.append(times2)
times3_all.append(times3)
times1_mean = np.mean(times1_all, axis=0)
times2_mean = np.mean(times2_all, axis=0)
times3_mean = np.mean(times3_all, axis=0)
die Ergebnisse dieser Tests sind unten in der Abbildung dargestellt, die die verstrichene Zeit von verschiedenen Algorithmen in Abhängigkeit von der Bildpixelzahl zeigt (I zitieren Sie nur die Seitenzahl der Pixel in der x-Achse). Wie erwartet, je größer das Bild, desto länger dauert es, um den Job zu erledigen. Es ist jedoch klar, dass es systematische Unterschiede zwischen den Algorithmen gibt. Für eine beliebige Anzahl von Pixeln sind die von @randomir und @Ofer vorgeschlagenen Algorithmen besser als die von @ user1717828 vorgeschlagenen. Gemäß dieser Metrik sind @Ofer und $ randomir gleichwertig.
"Zeit" ist nicht wirklich angemessen, um die Leistung zu messen. Zu diesem Zweck befindet sich das Modul 'timeit' in der Standardbibliothek. Die Verwendung einer hohen Anzahl von Wiederholungen und Läufen mit Zeit hilft, ** wirklich genaue Zeitangaben zu erhalten **. – MSeifert
Ich wette, ich werde die gleiche Antwort bekommen. Ich bin hier im Durchschnitt über mehrere Studien. – Alejandro
Dann ein weiterer Punkt: Der Durchschnitt ist ein schlechtes Maß für die Leistung läuft über viele Wiederholungen. Normalerweise sollten Sie das [Minimum] (https://docs.python.org/3/library/timeit.html#timeit.Timer.repeat) nehmen. – MSeifert
- 1. Sollten Sie rgba (0, 0, 0, 0) oder rgba (255, 255, 255, 0) für Transparenz in CSS verwenden?
- 2. Konvertieren (0,1,0, 0, 1, 1, 1) zu (0, 0, 0, 1, 0, 1, 2) in R
- 3. Ist! 0 und! 1 besser als 1 und 0?
- 4. NumPy-Array von 0 und 1 begrenzt?
- 5. Wie kann ich und 2d Array aus Index [1] [1] anstelle von [0] [0]
- 6. Zufallsvektor zwischen 0 und 1
- 7. Turing Maschinenkonstruktion 0 und 1
- 8. wie 1 zu 0 und 0 zu 1 in binär geändert werden (Python)
- 9. Permutationen von 0 und 1
- 10. UML-Zusammensetzung 1. * und 0. *
- 11. Warum! (0 || 1 || 0) ist 0?
- 12. Schreiben auf Array-Element [i] [0] [1] auch überschreibt [i] [1] [0] und vice versa
- 13. Wie Texteingabefeld beschränken nur 0 und 1
- 14. Java: Ändern einer binären Zahl Bits 0 zu 1 und 1 zu 0
- 15. 1 zu 0-1 Beziehung?
- 16. Java (0/0) und (0/0.0) Ausgabevergleich
- 17. Verwenden von RGB-Werten in TKinter? Z.B. 255, 0, 0
- 18. Rubin warum 0 || 1 0
- 19. 1: 0:
- 20. zookeeper kann den Socket zu localhost nicht öffnen 0: 0: 0: 0: 0: 0: 0: 1: 2181
- 21. Prolog, Prädikat, das 1 bis 0 und 0 bis 1 tauscht und in eine Liste einfügt
- 22. 0 und 1 in einem binären Array invertieren
- 23. Fatal error: Array Rückruf hat enthalten Indizes 0 und 1
- 24. Wie zu 0/1 Teilmenge in Theano?
- 25. Berechnung 0 und 1 ist in PHP
- 26. Was bedeutet this.allow =! 1 und this.allow =! 0?
- 27. FATAL ERROR: Array Rückruf muss enthalten Indizes 0 und 1
- 28. Was bedeutet! 1 und! 0 in Javascript?
- 29. Regex n 0 und dann eine 1
- 30. Alle Möglichkeiten Permutationen von 0 und 1
Sie können tun '-a.astype (np.int8)', für diesen speziellen Fall würde der Überlauf genau richtig arbeiten. – Akavall