私は、数値が0と255の値を持つ(範囲内に他の値はありません)数値配列として表された画像を持っています。それを0と1の配列に変換する最良の方法は何ですか?言い換えれば配列値0と255を対応する0と1の配列に変換する方法
答えて
my_array = np.array([255,255,0,0])
my_array = my_array/255
ウィル出力
array([ 1., 1., 0., 0.])
、それは0〜255の範囲内のすべての値は、(あなたはそれが唯一の2つの値だと述べているにもかかわらず、それはすべてのために働くだろう何のノーマライズを動作しません間でも、比率を維持しながら)
あなたは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])
が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と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は同等です。
'time'はパフォーマンスを測定するのに実際には適切ではありません。このため、 'timeit'モジュールは標準ライブラリにあります。リピート数を増やしてtimeitで実行すると、本当に正確なタイミング**が得られます。 – MSeifert
私は同じ回答を得るでしょう。私はここでいくつかの試行を平均しています。 – Alejandro
もう一つのポイント:平均は、多くのリピートでのパフォーマンスランの悪い尺度です。通常、[最小](https://docs.python.org/3/library/timeit.html#timeit.Timer.repeat)を使用してください。 – MSeifert
- 1. 1と0の配列をバイナリ変数に変換する
- 2. numpyの配列値を0から-1に変更する
- 3. 配列[beg [0]:end [0]、beg [1]:end [1]、...]
- 4. 0と1のリストをビット配列(ビット配列モジュール)に変換してバイナリファイルに出力するエラー
- 5. バイナリ配列の反転0と1
- 6. 割当1と0の値numpyの配列に値がリスト
- 7. ベース1配列をベース0配列に変更
- 8. 配列の初期値を0に設定する方法
- 9. 0と1をテキストファイルから2次元配列に変換します。
- 10. 配列をキーと値のペア配列に変換する方法は?
- 11. NSDATAに0から255(1バイト)の整数を変換する
- 12. 1と0の文字列をバイナリファイルに変換する
- 13. アンドロイドスタジオのRGB値(0〜255)をCMYK値(0〜99)に変換する方法はありますか?
- 14. char配列内の1と0の数をカウントする
- 15. 可変配列のNSNumber = 0
- 16. '\ 0'を含むstd :: stringをchar *配列に変換する方法は?
- 17. 行列要素をRの0 | 1から1 | 0に変換するには?
- 18. CSV(配列と辞書)値をJSONに変換する方法
- 19. 文字列を配列(intとstring配列)に変換する方法?
- 20. atoi文字列の一部を配列[0]に配置する
- 21. Jaudiotagger getAll(FieldKey.COMMENT)は0と1の配列を返します
- 22. JavaScript配列の値を配列の値に変換する
- 23. PHP配列 - 配列に値を返し、0
- 24. 数字の配列を、0を陽性として符号の配列に変換します。
- 25. 0-1無限整数配列のナップザック?
- 26. 数値の文字列配列を整数の配列に変換するとき、要素は0に変わります
- 27. int 2D配列に0と1をランダムに埋め込む方法は?
- 28. 0と1はJavaの代替配列セルです
- 29. 1次元配列を2次元配列に変換する方法
- 30. PythonでNearest Neighbor Algorithmを使用して配列出力[0 0 0]を[0、0、0]に変換するにはどうすればよいですか?
あなたが行うことができます '-a.astype(np.int8は)'、この特定のケースのために、オーバーフローが正確に右に働くだろう。 – Akavall