2016-11-26 5 views
1

すべての形状が異なる3D配列のリストがありますが、すべて同じ形状にする必要があります。また、その形状はリスト内の最小の形状である必要があります。Pythonでリスト内の複数の配列を再編成する方法

たとえば、3つの配列が(115,115,3)、(111,111,3)、(113,113,3)の形状を持つmy_listは、すべてが(111,111,3)である必要があります。それらはすべて正方形のカラー画像なので、形状(x、x、3)になります。

だから私は、主に2つの問題を抱えて:私はリストを作成しながら、変数をループしたり維持することなく、最小の形状配列を見つけるにはどうすればよい

  • を?
  • リスト内のすべての配列を最小の形状に効率的に設定するにはどうすればよいですか? my_listというの作成中に

は現在、私はので、私はこれを行うことができる最小の形状のための変数を保管しております:

for idx, img in enumerate(my_list): 
    img = img[:smallest_shape,:smallest_shape] 
    my_list[idx] = img 

私はちょうどこのように感じているではない、最も効率的な方法を、私は私は実現しませんスライスして値を失うが、私はそれを期待する。

+0

1.ソートされていない限り、全体をループせずに最小値を見つけることはできません。しかし、ソートは単なる最小のものを見つけるだけではありません。 2.スライスによる設定は、内部的にnumpyがオブジェクトをコピーする代わりにビューオブジェクトを作成するので、すでに非常に効率的です。 – Kh40tiK

+0

オプションの読み込み中に画像のサイズを変更していますか?これにより、すべての画像が同じ形状になります。 – OddNorg

+0

あなたはそれらの中心に集中したいのですか、または余分な行の列を右下と左上と上にトリミングしたいだけですか? – NaN

答えて

2

私は

In [513]: alist=[np.ones((512,512,3)) for _ in range(100)] 

でサンプルリストを構築し、いくつかのタイミングをしました。図形を収集

は速いです:分を取る

In [515]: timeit [a.shape for a in alist] 
10000 loops, best of 3: 31.2 µs per loop 

は、より多くの時間を要する:

In [516]: np.min([a.shape for a in alist],axis=0) 
Out[516]: array([512, 512, 3]) 
In [517]: timeit np.min([a.shape for a in alist],axis=0) 
1000 loops, best of 3: 344 µs per loop 

スライスは今minステップを隔離しよう

In [518]: timeit [a[:500,:500,:] for a in alist] 
10000 loops, best of 3: 133 µs per loop 

高速です。

In [519]: shapes=[a.shape for a in alist] 
In [520]: timeit np.min(shapes, axis=0) 
The slowest run took 5.75 times longer than the fastest. This could mean that an intermediate result is being cached. 
10000 loops, best of 3: 136 µs per loop 

オブジェクトのリストがある場合は、すべての要素を処理する唯一の方法です。 np.hstacknp.vstack(およびその他)のコードを見てください。彼らは1つまたは複数のリスト内包を行い、すべての入力配列を正しい形状にマッサージします。それでは、np.concatenateを繰り返しますが、コンパイルされたコードで繰り返します。

+1

ありがとう、私はそのようなソースコードを調べるとは思わなかった。私はあなたの応答をupvoteしたいと思いますが、私は過去10年間SOだけを見たことがあるので、十分な評判はまだありません。 – wrestang

関連する問題