2016-04-19 8 views
1

たとえば、私は形状が1000*3*256*256のnumpyの配列aを持っています。 つまり、aは1000個の画像の配列で、各画像のサイズは3*256*256です。 私はすべてのイメージをランダムに反転したいので、私の質問は効果的にこれを行う方法です。ありがとう!numpyの配列内のすべての画像をランダムに反転する最も効果的な方法

+0

あなたがそれらすべてをやっている場合、それはどのようにランダムにすることができますか? –

+0

実際にコードを書いたことはありますか? *「ランダムなフリップごとの画像」を定義する* – SiHa

+0

実際、この種の操作は、深い学習文献のデータ拡張と呼ばれています。私は非常に遅いかもしれないので、forループを使いたくない...私は@ BlackBearの方法を試してみるよ、ありがとう –

答えて

1

基本:array[slice(a,b,c)]array[a:b:c]に相当し、(「フリップ」)array[::-1]同じである配列の使用slice(None, None, -1)を、逆にします。

それでは、画像毎にランダムフリップを構築しましょう:

>>> import random 
>> flips = [(slice(None, None, None), 
...   slice(None, None, random.choice([-1, None])), 
...   slice(None, None, random.choice([-1, None]))) 
...   for _ in xrange(a.shape[0])] 

最初のスライスは、第二Y軸のためであり、第3は、X軸用で、チャネルのためのものです。のは、いくつかのテストデータを構築してみましょう:

>>> import numpy as np 
>>> a = np.array(range(3*2*5*5)).reshape(3,2,5,5) 

私たちは、各画像に個別にランダムフリップを適用することができます。

>>> flips[0] 
(slice(None, None, None), slice(None, None, -1), slice(None, None, None)) 
>>> a[0] 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]], 

     [[25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39], 
     [40, 41, 42, 43, 44], 
     [45, 46, 47, 48, 49]]]) 
>>> a[0][flips[0]] 
array([[[20, 21, 22, 23, 24], 
     [15, 16, 17, 18, 19], 
     [10, 11, 12, 13, 14], 
     [ 5, 6, 7, 8, 9], 
     [ 0, 1, 2, 3, 4]], 

     [[45, 46, 47, 48, 49], 
     [40, 41, 42, 43, 44], 
     [35, 36, 37, 38, 39], 
     [30, 31, 32, 33, 34], 
     [25, 26, 27, 28, 29]]]) 

あなたは画像を垂直方向に反転させflips[0]、見ることができるように。今では、各画像のためにそれを行うには簡単です:

>>> random_flipped = np.array([img[flip] for img, flip in zip(a, flips)]) 
+0

こんにちは、私はすべての画像をランダムに反転させることを意味します。 –

+0

ありがとう、これは私が欲しいものです。 –

関連する問題