2013-02-22 47 views
5

作爲一個小的練習,然後我開始在Python中使用數字代碼來玩遊戲,我試圖做一個LDLT算法。只是爲了「讓腳溼」。基本的Numpy數組值賦值

但是,我似乎缺乏對numpy數組的基本理解。請參閱以下示例:

def ldlt(Matrix): 
    import numpy 

    (NRow, NCol) = Matrix.shape 

    for col in range(NCol): 
     Tmp = 1/Matrix[col,col] 
     for D in range(col+1, NCol): 
      Matrix[col,D] = Matrix[D,col]*Tmp 

if __name__ == '__main__': 
    import numpy 
    A = numpy.array([[2,-1,0],[-1,2,-1],[0,-1,2]]) 
    ldlt(A) 

該示例並非我正在處理的完整代碼。然而,嘗試運行它,並設置一個斷點在矩陣[col,D] = ...

我期望的第一次評估是行0列1(起始值爲-1)是設置等於= -1 *(1/2)= -0.5。

但是,在運行代碼時,它似乎設置爲0.爲什麼? 必須有一些基本的東西我沒有真正理解?

在此先感謝你們所有人幫助我。

EDIT 1:

的Python版:3.3 TMP .:成爲0.5(據報道由我的調試器)。

回答

3

下可能會顯示這是怎麼回事:

>>> A = np.array([[2,-1,0],[-1,2,-1],[0,-1,2]]) 
>>> A.dtype 
dtype('int32') 
>>> A[0, 1] 
-1 
>>> A[0, 1] * 0.5 
-0.5 
>>> A[0, 1] *= 0.5 
>>> A[0, 1] 
0 
>>> int(-0.5) 
0 

你的陣列只能容納32位整數,所以你嘗試任何浮點值分配它會被轉換,即截斷,到一個int32。


以同樣的價格,在這裏是做你是什麼之後更numpythonic方式:for循環一般是要避免的,因爲他們擊敗numpy的整個目的:

def ldlt_np(arr) : 
    rows, cols = arr.shape 
    tmp = 1/np.diag(arr) # this is a float array 
    mask = np.tril_indices(cols) 
    ret = arr * tmp[:, None] # this will also be a float array 
    ret[mask] = arr[mask] 

    return ret 

>>> A = np.array([[2,-1,0],[-1,2,-1],[0,-1,2]]) 
>>> ldlt_np(A) 
array([[ 2. , -0.5, 0. ], 
     [-1. , 2. , -0.5], 
     [ 0. , -1. , 2. ]]) 
+0

是的,就是這樣。非常感謝 - 在我偶然發現之前已經很長時間了。 – Daniel 2013-02-22 16:36:57

0

numpy數組有固定類型。您不能將int數組稍後更改爲浮點數。初始化數組float數組:

A = numpy.array([[2, -1, 0], [-1, 2, -1], [0, -1, 2]], numpy.float) 
+0

我在蟒3.3。檢查我的代碼 - Tmp在評估時變成0.5。 – Daniel 2013-02-22 16:23:26

+0

編輯,但爲時已晚:) – 2013-02-22 16:30:23