2014-12-13 214 views
1

我試圖找回225,30×30點的矩陣,從一個矩陣是450利用切片450如何通過n矩陣每n由M矩陣

我能得到一個30提取一個m由30矩陣,但我不知道如何迭代,並得到休息,有無論如何這樣做?

x = 30 
extract = [] 
extract1 = [] 

while (x < 450): 
    extract1 = test1[x:, x:] 
    x += 30 
    extract.append(extract1) 
+0

有很多方法可以從你的大矩陣中提取30×30的矩陣,請說明哪些你想提取和你的代碼有什麼問題。 – elyase 2014-12-13 16:31:41

+0

我想要所有的225個,但是隨着代碼的迭代,矩陣變爲60乘60,依此類推。我的代碼僅適用於提取第一個30乘30矩陣 – user4357505 2014-12-13 16:34:10

+0

*爲什麼「你想這樣做?下面的一些解決方案正確回答了這個問題,但是有更有效的方法,特別是如果以後你要計算平均數或每個新的30x30象限的總和,另外,這個問題在幾天前被一位作者提出,他刪除了他自己的問題,如果那是你,那麼不要重複發佈一次 – 2014-12-13 17:58:02

回答

0

我覺得這給你所需要的輸出,但我相信有一個更優雅的方式來做到這一點。

import numpy as np 

a = np.arange(16).reshape(4,4) 
extracts = [] 
x = 2 

for i in xrange(x): 
    for j in xrange(x): 
     extracts.append(a[i*x :x + i*x, j*x : x + j*x]) 
1

使用numpy的公司跨入觀點:

import numpy as np 

def make_windows(x, ws): 
    m,n = x.shape 
    s,t = ws 
    shape = (m/s, n/t) + ws 
    strides = (s * x.strides[0], t * x.strides[1]) + x.strides 
    windows = np.lib.stride_tricks.as_strided(x, shape=shape, strides=strides) 
    return windows.reshape(-1, s, t) 

讓我們嘗試一下的一些數據:

>>> data = np.arange(450*450).reshape(450,450) 
>>> windows = make_windows(data, (30,30)) 
>>> windows.shape 
(225, 30, 30) 
>>> windows 
array([[[  0,  1,  2, ...,  27,  28,  29], 
     [ 450, 451, 452, ..., 477, 478, 479], 
     [ 900, 901, 902, ..., 927, 928, 929], 
     ..., 
     [ 12150, 12151, 12152, ..., 12177, 12178, 12179], 
     [ 12600, 12601, 12602, ..., 12627, 12628, 12629], 
     [ 13050, 13051, 13052, ..., 13077, 13078, 13079]], 

     [[ 30,  31,  32, ...,  57,  58,  59], 
     [ 480, 481, 482, ..., 507, 508, 509], 
     [ 930, 931, 932, ..., 957, 958, 959], 
     ..., 
     [ 12180, 12181, 12182, ..., 12207, 12208, 12209], 
     [ 12630, 12631, 12632, ..., 12657, 12658, 12659], 
     [ 13080, 13081, 13082, ..., 13107, 13108, 13109]], 

     ..., 
+0

這是我要去的方法還有一個'einsum'或者類似的東西,非常有效的記憶。 – 2014-12-13 18:16:52