2016-03-08 30 views
0

我需要乘以兩個巨大的向量(30720,1)*(1,30720),所以這將產生一個30720 * 30720矩陣。我使用numpy.dot來增加它們,但它需要很長時間。乘以兩個巨大的矩陣使用numpy.dot

+0

是什麼這與C++有關?而30kx30k的矩陣非常龐大,當然需要很長的時間進行計算。 –

+0

當然這個乘法需要時間。而專門優化的低級例程通常比像numpy這樣的通用工具更有效率(即使numpy已經擅長這種操作)。那個卑鄙的人說,對於SO網站來說,任何認真的答案都可能太長,所以這個問題對我來說看起來太寬泛了。 –

+1

Numpy使用類似BLAS的庫來進行這種計算。但記憶掉期可能會扼殺時間。 – hpaulj

回答

1

float64數據,結果大小約爲7 Go,因此它不適合大量的PC RAM。但是你只有30720²#1e9乘法運算,這需要幾秒鐘的時間。

避免記憶問題的辦法是削減的結果在合理的數據塊,與尺寸< 1Go,並保存在速度二進制協議文件中的部分結果,與加控制會發生什麼:

n=3 
div=10240 
a=rand(n*div,1) 
b=rand(1,n*div) 
import pickle 

def calculate(i,j): 
    u=dot(a[i*div:(i+1)*div,:],b[:,j*div:(j+1)*div]) 
    return u 

def save(i,j,u): 
    with open('data'+str(i)+str(j)+'.pk','wb') as f : 
        pickle.dump(u,f) 

def timecount(f,args): 
    t0=time.time() 
    res=f(*args) 
    return res,time.time()-t0 

def multidot(): 
    tcalc,tsave=0,0 
    for i in range(n): 
    for j in range(n): 
     print (i,j) 
     u,dt=timecount(calculate,(i,j)) 
     tcalc+=dt 
     _,dt=timecount(save,(i,j,u)) 
     tsave+=dt 
    print('dot time',tcalc) 
    print('save time',tsave) 

然後運行:

In [64]: multidot() 
0 0 
0 1 
0 2 
1 0 
1 1 
1 2 
2 0 
2 1 
2 2 
dot time 4.697121858596802 
save time 29.11250686645508 

所以,你有沒有問題dot,只與內存問題。

讀回數據,由塊讀,塊,這樣的:

with open('data00.pk','rb') as f : u=pickle.load(f) 

此運行後,不要忘了del data*.pk,它需要6Go磁盤上;)