2011-08-31 30 views
2

我目前正在編寫基於輸入文件爲運輸包生成矩陣的函數。這是一個代表網絡中區域的1850x1850矩陣。這1850個區域也被劃分爲10個不同的區域組。基本上我需要分配一個時間因子(編號)到每個組合起源區域到目標區域。python numpy - 有效的密集矩陣創建

我的主循環:

for i,start in enumerate(starts): 
     #Create the matrix 
     mat,data = creatematrix(ID)  #1850x1850 

     #Read in the time factors 
     lines = picklines(range(start+1,starts+21)) 
     lines = [lines[i]+lines[i+1] for i in range(0,len(lines),2)] 
     lines = [[float(v) for v in line] for line in lines] 

     #Now Lines contains the time periods for each combination of origin to destination zone 

     #Generated the matrix 
     for i in xrange(10): 
      for j in xrange(10): 
       #Assign the time factor for each O-D pair 
       I,J = PythonMatrixGroups[i,j] 
       data[I,J] = lines[i,j] 

     #Save matrix 
     mat.raw_data = data 

自然的時間大部分在雙循環度過的。這是生成這種密集矩陣的最快方法嗎?我也試過的方法:

PQ = PythonMatrixGroups 
    output = np.sum([coo_matrix((lines[i,j]*ones(len(PQ[i][j][0])), PQ),shape=((1850,1850))]) 
    mat.raw_data = output.toarray() 

但是主頻幾乎慢一倍

非常感謝,

+0

我無法跟隨你的代碼 - 你是否初始化一個形狀爲1850 x 1850的NumPy數組然後填充它?或者你通過做一些像列表中的「append」來構建它(即每次迭代添加一行)? – doug

+0

mat,data = createmat(ID)將數據初始化爲一個填充0的1850x1850 ndarray。主循環只是用數字填充矩陣,PythonMatrixGroups包含每個可能的O-D對的I,J's – Justin

+0

這種事情對於cython來說是一個理想的工作。如果您鍵入j和i作爲未簽名的整數,您應該會看到性能上的提升。如果您使用的是Ipython筆記本,使用%% cython魔法確實很容易,我自己也很驚訝。 – Magellan88

回答

0

應該可以做到在一個循環,因爲這:

#Generated the matrix 
    for i in xrange(10): 
     #Assign the time factor for each O-D pair 
     I = PythonMatrixGroups[i] 
     data[I] = lines[i] 

但我沒有測試這個。