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()
但是主頻幾乎慢一倍
非常感謝,
我無法跟隨你的代碼 - 你是否初始化一個形狀爲1850 x 1850的NumPy數組然後填充它?或者你通過做一些像列表中的「append」來構建它(即每次迭代添加一行)? – doug
mat,data = createmat(ID)將數據初始化爲一個填充0的1850x1850 ndarray。主循環只是用數字填充矩陣,PythonMatrixGroups包含每個可能的O-D對的I,J's – Justin
這種事情對於cython來說是一個理想的工作。如果您鍵入j和i作爲未簽名的整數,您應該會看到性能上的提升。如果您使用的是Ipython筆記本,使用%% cython魔法確實很容易,我自己也很驚訝。 – Magellan88