2017-08-07 13 views

答えて

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

ウィル出力

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

、それは0〜255の範囲内のすべての値は、(あなたはそれが唯一の2つの値だと述べているにもかかわらず、それはすべてのために働くだろう何のノーマライズを動作しません間でも、比率を維持しながら)

1

あなたはintを入力して変換した後)のいずれか>0または==255または本当に何かに(マスクすることができます:

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の値の画像である与えられたデータセットを作成する次のコードを書きました。そして、提案された各アルゴリズムの平均経過時間を調べ、画像のピクセル数を変更しました。 I)は、測定におけるノイズを低減するために、平均を使用:

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) 

この試験の結果は、画像の画素数の関数として、異なるアルゴリズムの経過時間を示しており、下図に示されている(私はx軸のピクセルのサイド・ナンバーを引用するだけである)。予想どおり、画像が大きくなればなるほど、仕事を行うのに時間がかかります。しかしながら、アルゴリズム間には系統的な相違があることは明らかである。任意のピクセル数に対して、@randomirと@Oferによって提案されたアルゴリズムは、@ user1717828で提案されたアルゴリズムよりも優れています。このメトリックによれば、@Oferと$ randomirは同等です。

Comparison of algorithms

+0

'time'はパフォーマンスを測定するのに実際には適切ではありません。このため、 'timeit'モジュールは標準ライブラリにあります。リピート数を増やしてtimeitで実行すると、本当に正確なタイミング**が得られます。 – MSeifert

+0

私は同じ回答を得るでしょう。私はここでいくつかの試行を平均しています。 – Alejandro

+0

もう一つのポイント:平均は、多くのリピートでのパフォーマンスランの悪い尺度です。通常、[最小](https://docs.python.org/3/library/timeit.html#timeit.Timer.repeat)を使用してください。 – MSeifert

関連する問題