2017-08-07 11 views

Antwort

1
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)

1

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]) 
+0

Sie können tun '-a.astype (np.int8)', für diesen speziellen Fall würde der Überlauf genau richtig arbeiten. – Akavall

2

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.

0

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.

Comparison of algorithms

+0

"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

+0

Ich wette, ich werde die gleiche Antwort bekommen. Ich bin hier im Durchschnitt über mehrere Studien. – Alejandro

+0

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

Verwandte Themen