2017-11-16 29 views
1
for x in range(0,img_row): 
    for y in range(0,img_col): 
     img_lst.append([img[x,y][0],img[x,y][1],img[x,y][2]]) 
return img_lst 

リストの理解はここでどうやって行うのですか?リストへの繰り返しの繰り返しpython 3

img_lst = [img[x,y][0], img[x,y][1], img[x,y][2] y for y in range(0,img_col) for x in range(0, img_row)] 

私はこれを試してみましたが、それは私の無効な構文を与えていると私は初めに「Y」を削除した場合、それがYが

に全体の機能を定義されていないことを私に与えます:

def cvimg_to_list(img): 
    img_row = img.shape[0] 
    img_col = img.shape[1] 
    img_lst=[] 

    img_lst = [img[x,y][0], img[x,y][1], img[x,y][2] y for y in range(0,img_col) for x in range(0, img_row)] 
    return img_lst 
+1

'のための十分な評判を持っていない... IMG [x、y]が[ 2] y ... 'これは間違っているようです –

答えて

4

list.append()を呼び出してネストされたループをリスト内包表記に変換するには、.append(...)カッコの間のすべてを前面に移動するだけで、forのループとフィンの後に:のコロンを削除します味方の結果を中心に[...]を追加します。

[ 
[img[x,y][0],img[x,y][1],img[x,y][2]] 
for x in range(0,img_row) 
    for y in range(0,img_col) 
] 

注を変更しないforループの順番ということ!

これを1行にまとめることができます。あなたは3つのミスを犯し

[img[x, y][:3] for x in range(img_row) for y in range(img_col)] 

:あなたはimg[x, y]から最初の3つの値を持つ新しいリストを作成するので、あなたはまた、スライスを使用することができます

[[img[x, y][0], img[x, y][1], img[x, y][2]] 
for x in range(img_row) for y in range(img_col)] 

:私は読みやすくするために、いくつかの空白を追加し、range()呼び出しを簡素化あなたの試みで。 forループの順序を入れ替え、余分に追加したのはyであり、各反復を生成するリストオブジェクトに対しては、]の終了括弧を削除しました。

1

私はあなたが達成しようとしていることについて完全には分かっていませんが、私の前提が正しい場合(opencvで開いた画像の3つのチャンネルからピクセル値のリストを取得したい場合)これを行うにはnumpyを使用できます。

img_lst=img.reshape(-1,3).tolist() 

cv2がイメージをBGRとして読み込み、RGBではなく読み込むことに注意してください。

注:適切質問への答えであること、私はむしろコメントとしてこれを投稿しなければならないが、私はその

+0

コメントは[一般目的]のために置かれていると考えてください(https://meta.stackexchange.com/questions/214173/why-do-i-need-50-たとえあなたがうまくいけば、うまく受け入れられないかもしれない迂回のための答えを使用することができます。この場合、OPがイメージをリストに縮小する方法を探しているだけで、あなたの投稿は答え**としてメリット**を持っていますが、彼らが明示的に理解リストを書くことに興味があれば... – Reti43