2013-06-29 117 views
3

我有一個900 x 650的二維numpy數組,我想分割成10 x 10塊,它將被檢查爲非零元素。是否有一種Pythonic的方式,我可以用numpy實現這一點?將塊狀數組分割成塊

我在尋找類似以下功能:

blocks_that_have_stuff = [] 
my_array = getArray() 
my_array.cut_into_blocks((10, 10)) 
for block_no, block in enumerate(my_array): 
    if numpy.count_nonzero(block) > 5: 
     blocks_that_have_stuff.append(block_no) 
+0

你的意思是'numpy.count_nonzero(block)> 5'? – Elazar

+0

哎呀,這就是我的意思。 –

+0

你的街區應該如何設置?這是所有可能的10x10塊嗎?只是非重疊的10x10塊。 –

回答

6

我寫道,砍你的塊矩陣的例程。這個例子很容易理解。我以簡單的形式寫出來顯示結果(僅用於檢查目的)。如果你對它感興趣,你可以在輸出中包含塊的數量或任何東西。

import matplotlib.pyplot as plt 
import numpy as np 

def cut_array2d(array, shape): 
    arr_shape = np.shape(array) 
    xcut = np.linspace(0,arr_shape[0],shape[0]+1).astype(np.int) 
    ycut = np.linspace(0,arr_shape[1],shape[1]+1).astype(np.int) 
    blocks = []; xextent = []; yextent = [] 
    for i in range(shape[0]): 
     for j in range(shape[1]): 
      blocks.append(array[xcut[i]:xcut[i+1],ycut[j]:ycut[j+1]]) 
      xextent.append([xcut[i],xcut[i+1]]) 
      yextent.append([ycut[j],ycut[j+1]]) 
    return xextent,yextent,blocks 

nx = 900; ny = 650 
X, Y = np.meshgrid(np.linspace(-5,5,nx), np.linspace(-5,5,ny)) 
arr = X**2+Y**2 

x,y,blocks = cut_array2d(arr,(10,10)) 

n = 0 

for x,y,block in zip(x,y,blocks): 
    n += 1 
    plt.imshow(block,extent=[y[0],y[1],x[0],x[1]], 
       interpolation='nearest',origin='lower', 
       vmin = arr.min(), vmax=arr.max(), 
       cmap=plt.cm.Blues_r) 
    plt.text(0.5*(y[0]+y[1]),0.5*(x[0]+x[1]),str(n), 
      horizontalalignment='center', 
      verticalalignment='center') 

plt.xlim([0,900]) 
plt.ylim([0,650]) 
plt.savefig("blocks.png",dpi=72) 
plt.show() 

輸出是:

enter image description here

問候

注:我想你可以使用np.meshgrid代替了很多附加與xextent & yextent優化這個程序。

+0

令人驚歎的,正是我一直在尋找。我希望我能代表更多這個令人難以置信的答案。 –

+0

@DanDoe,我相信你可以在你的問題上發佈獎勵(發佈後2天),並將其授予上述答案。 – Akavall