内側のループ ロジックは間違っていますが、特に次の行は次のとおりです。
image[c:c+3], image[-c-3: -c] = image[-c-3: -c], image[c:c+3]
変数をその場で変更してimage
いますが、行変数を忘れているようですr
。だから今、あなたは行を変えています。そして、あなたのネガティブスライスは少しずれています。の場合c=0
、image[-3:0]
これは有効なスライスではなく、 が返され[]
ます。
しかし、コードから判断すると、そのimage
場で変更するつもりはなく、作成したいnew_image
. あなたがすべきことは、の最後にスライスを挿入することですnew_row
:
def horizontal_flip(image):
rows = len(image)
cols = len(image[0])
new_image = []
for r in range(rows):
new_row = []
for c in range(0,cols,3):
new_row = image[r][c:c+3] + new_row
new_image.append(new_row)
return new_image
ちなみに、image
インプレースも変更できますが、注意が必要です。を渡しているlist
ので、元が変更されないように、変更する前にコピーする必要があります。そのバージョンは次のとおりです。
def horizontal_flip(image):
cols = len(image[0])/3
#make a copy so that original image is not altered
image = [row[:] for row in image]
for row in image:
for c in range(int(cols/2)): # int() is not needed for Python 2.x, since integer division yields integer
# This also takes care of odd n cases, middle chunk is not changed.
row[3*c:3*c+3], row[3*(cols-c-1):3*(cols-c-1)+3] = row[3*(cols-c-1):3*(cols-c-1)+3], row[3*c:3*c+3]
return image
これは、1 行のリスト内包表記でも実行できますが、読みにくくなります。必要に応じて、次の方法で実行できます。
from itertools import chain
flipped_image = [list(chain(*[row[3*i:3*i+3] for i in range(len(image[0])/3-1,-1,-1)])) for row in image]