2017-08-02 72 views
2

這裏更快速的方法是我的用於劃分兩個矩陣代碼:用於將兩個矩陣在8點小矩陣

def divideM1(X,Y): 
    n=len(X) 
    a=[[col for col in row[:len(row)/2]] for row in X[:n/2]] 
    b=[[col for col in row[len(row)/2:]] for row in X[:n/2]] 
    c=[[col for col in row[:len(row)/2]] for row in X[n/2:]] 
    d=[[col for col in row[len(row)/2:]] for row in X[n/2:]] 
    e=[[col for col in row[:len(row)/2]] for row in Y[:n/2]] 
    f=[[col for col in row[len(row)/2:]] for row in Y[:n/2]] 
    g=[[col for col in row[:len(row)/2]] for row in Y[n/2:]] 
    h=[[col for col in row[len(row)/2:]] for row in Y[n/2:]] 

    return a,b,c,d,e,f,g,h 

def divideM2(X,Y): 
    n=len(X) 
    a=[[0 for i in range(n/2)] for j in range(n/2)] 
    b=[[0 for i in range(n/2)] for j in range(n/2)] 
    c=[[0 for i in range(n/2)] for j in range(n/2)] 
    d=[[0 for i in range(n/2)] for j in range(n/2)] 
    f=[[0 for i in range(n/2)] for j in range(n/2)] 
    e=[[0 for i in range(n/2)] for j in range(n/2)] 
    g=[[0 for i in range(n/2)] for j in range(n/2)] 
    h=[[0 for i in range(n/2)] for j in range(n/2)] 

    for i in range(n/2): 
     for j in range(n/2): 
     a[i][j]=X[i][j] 
     b[i][j]=X[i][j+n/2] 
     c[i][j]=X[i+n/2][j] 
     d[i][j]=X[i+n/2][j+n/2] 
     e[i][j]=Y[i][j] 
     f[i][j]=Y[i][j+n/2] 
     g[i][j]=Y[i+n/2][j] 
     h[i][j]=Y[i+n/2][j+n/2] 
    return a,b,c,d,e,f,g,h 

如果我使用了time.time()似乎方法2-「divideM2」比方法1快 - 「divideM1」但爲什麼呢? 有沒有更好的方法來劃分?

EDIT1: 有趣的是,當我使用了time.time():

start = time.time() 
print("method1") 
for i in range(10000): 
    1>2 
divideM2(a1,a1) 
end = time.time() 
t1=end-start 
print t1 ,"m1" 

start = time.time() 
print("method2") 
for j in range(10000): 
    1>2 
divideM1(a2,a2) 
end = time.time() 
t2= end-start 
print t2, "m2" 

if t1>t2: 
    print "method 2 is faster" 
else: 
    print "method 1 is faster" 

我總是得到 「方法2是更快」 即使我比較 「divide1」 本身。有人可以解釋這一點嗎?

+0

我的兩個問題是: 1)爲什麼div2快於div1? 2)有沒有更好的方法? – n0unc3

+0

這需要[NumPy](http://www.numpy.org/)! – perigon

+2

爲什麼你重複第二個矩陣的代碼?你可以將一個分成4個矩陣,然後調用這個方法兩次。 – Feodoran

回答

0

我認爲方法2更快,因爲您只使用2個循環,而不是所有在第一個方法中使用的for循環。

關於以另一種方式做它,你可以嘗試numpy.split。這裏是doc

+0

但我也使用多個for循環來初始化方法2中的多個子數組 – n0unc3