2012-04-07 8 views
10

NumPyでコピーを作成せずに、指定された軸に沿って多次元配列(つまり、タイプ)を平坦化する方法があるかどうかは疑問です。たとえば、私は2D画像の配列を持っており、それぞれをベクトルにフラット化したいと考えています。したがって、簡単な方法の1つはnumpy.array([im.flatten() for im in images])ですが、それはそれぞれのコピーを作成します。NumPyでコピーを作成せずに多次元配列の軸を平らにする方法は?

答えて

12

ravelそれ:

>>> a = numpy.arange(25).reshape((5, 5)) 
>>> b = a.ravel() 
>>> b[0] = 55 
>>> a 
array([[55, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]]) 

それともreshapeそれ:

>>> a = numpy.arange(27).reshape((3, 3, 3)) 
>>> b = a.reshape((9, 3)) 
>>> b[0] = 55 
>>> a 
array([[[55, 55, 55], 
     [ 3, 4, 5], 
     [ 6, 7, 8]], 

     [[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]], 

     [[18, 19, 20], 
     [21, 22, 23], 
     [24, 25, 26]]]) 

ほとんどの状況下では、これらは両方とも、元の配列ではなく、コピーのビューを返します。

+0

ありがとうございました! 'reshape'は私のトリックでした。私はそれが私の2D行列とベクトルとの間の1対1のマッピングを壊す前に考えました。しかし、いいえ、それは働いた! –

7

あなたが入力配列の形状がわからない場合:

images.reshape((images.shape[0], -1)) 

-1は残りの次元を動作するように作り変えるように指示します。これは、 が画像の最初の軸を平坦にしたいと仮定しています。

関連する問題