2017-08-07 113 views

回答

1
my_array = np.array([255,255,0,0]) 
my_array = my_array/255 

將輸出

array([ 1., 1., 0., 0.]) 

換句話說,它會工作沒有正常化的0-255(即使你說,這是唯一的2個值範圍內的所有值,它會爲一切工作在兩者之間爲好,同時保持比)

1

可以屏蔽(或者與>0==255還是真的什麼都重要),然後轉換成鍵入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

你可以做'-a.astype(np.int8)',在這種特定情況下,溢出將工作完全正確。 – Akavall

2

聽起來像是numpy.clip作業:

>>> a = np.array([0, 255, 0, 255, 255, 0]) 
>>> a.clip(max=1) 
array([0, 1, 0, 1, 1, 0]) 

從文檔:

給定一個時間間隔,在時間間隔外值被夾在間隔邊緣。例如,如果指定了[0,1]的間隔,則小於0的值變爲0,並且大於1的值變爲1.

0

因爲有太多答案給出正確答案,所以我只是想要測試不同的方法,並決定在計算成本方面哪個最好。我編寫了下面的代碼,它創建一個給定的數據集,它是一個隨機放置的0和255值的圖像,然後研究每個提議的算法的平均流逝時間,改變圖像的像素數量(注意我用平均以減少在測量中的噪聲):

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) 

該測試的結果顯示在下面的圖像中,其示出了不同的算法的經過時間爲(I圖像的像素數目的函數僅引用x軸上的像素的邊數)。正如預期的那樣,圖像越大,執行這項工作所需的時間就越長。然而,顯然在算法之間存在系統差異。對於任意數量的像素,@randomir和@Ofer提出的算法比@ user1717828提出的算法要好。所以,根據這個度量標準,@Ofer和$ randomir是等價的。

Comparison of algorithms

+0

「時間」並不適合衡量績效。爲此,'timeit'模塊位於標準庫中。使用大量重複和timeit運行有助於獲得**真正準確的計時**。 – MSeifert

+0

我敢打賭,我會得到同樣的答案。我在這裏進行了多次試驗。 – Alejandro

+0

然後還有一點:對許多重複的性能來說,平均值是一個不好的衡量標準。通常你應該採用[最低](https://docs.python.org/3/library/timeit.html#timeit.Timer.repeat)。 – MSeifert

相關問題