2016-04-11 20 views
0

私は解決するための問題を抱えており、私は良い解決策を考え出すことができません。python numpy配列です。どのように効率的に複数の配列をスライスするには?

私は10x10の配列を得て、私は3x3の "小さな配列"をスライスしたいと思います。私は基本的には、第1のスライスとnumpyの配列のパッチを作成し、その後他のすべてのスライスを追加

array = np.arange(100).reshape((10,10)) 

patch = np.array(array[:3, :3] 

for n in range(3, 10, 3): 
    for m in range(3, 10, 3): 
     patch = numpy.append(patch, array[n:n+3, m:m+3] 

:今、私はこれを次のように行います。これの問題は、その恐ろしいほど遅くて、numpyのスライシングの機会をうまく利用していないことです。私ははるかに大きな配列の高い数のためにこれを行う必要があります。 誰も私にこれをより効率的にする方法のアドバイスを与えることができますか? 1000ありがとう!

+0

なぜ「パッチ」を追加しますか?もしpatchがスライス、すなわち 'patch = array [n:n + 3、m:m + 3] 'スライスであれば、' patch'で変更された値は 'array'で変更されます。メモリの問題であれば、[dask](http://dask.pydata.org/en/latest/) –

+0

こんにちは、お返事ありがとうございます。私は最後に持っていたいです大きな配列配列に可能なすべての3x3スライスを含む配列(パッチ)。私はこれを、1つのエントリ(スライス1)で適切な次元(私は自分の仕事でより次元の配列を使用しています)を作成し、後で他のスライスを追加するという醜い方法で行います。あなたは私がそれを行う方法で言うも配列を変更するか?私はそれをしたくない、配列はパッチから独立しているべきである – idontknow

+0

私はまだあなたがパッチに配列を分割したい理由、または変更パッチが配列のその部分を変更することがなぜ問題なのか、また、軸を設定せずにappendを使うと、2次元配列を1次元に変えることができます。いくつかの簡単な例を使って何をしたいのかを見せてもらえますか? –

答えて

0

問題は完全にnumpy.appendです。 appendは、使用するたびに新しい配列を作成します。パッチ配列が大きくなるにつれて、これは徐々に長くなります。

代わりに、パッチ配列の最終サイズが分かっている既定の配列を使用し、データの中間コピーを作成しないようにします。

# setup 
x, y = 999, 999 
array = np.arange(x * y) 
array.shape = x, y 
little_array_size = 3 

# creates an array of "little arrays" 
patch = np.empty(array.size, dtype=int) 
patch.shape = -1, little_array_size, little_array_size 

i = 0 
for n in range(0, array.shape[0], little_array_size): 
    for m in range(0, array.shape[1], little_array_size): 
     # uses view, so data is copied straight from array to patch 
     patch[i,:] = array[n:n+little_array_size, m:m+little_array_size] 
     i += 1 

patch.shape = -1 # flattens array 

上記は私のコンピュータ上の第二の三(二桁速くnumpy.append(20+秒)を使用するよりも)ほどかかります。

+0

ああ、それは私が探していたものでした。おかげで、100倍も速く動くようになった。 – idontknow