2013-02-22 2 views
5

작은 연습으로 파이썬에서 숫자 코드로 게임을 시작하기 전에 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) 

예제는 내가 수행중인 전체 코드가 아닙니다. 그러나 그것을 시도하고 그것을 실행하고 매트릭스 [콜, 디] = ...에서 중단 점을 설정합니다. ...

첫 번째 평가에 대한 기대는 행 0 열 1 (시작 값 -1) = -1 * (1/2) = -0.5로 설정하십시오.

그러나 코드를 실행하면 0과 동일하게 설정됩니다. 왜? 정말 이해하지 못했던 근본적인 것이 있어야합니까?

나를 도와 주신 모든 분들께 미리 감사드립니다.

편집 1 :

파이썬 버전 : (내 디버거에 의해 보도 된 바와 같이) 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가됩니다.

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

0

numpy 배열은 고정 유형입니다. int 배열을 나중에 float으로 변경할 수 없습니다. 수레의 배열로 배열을 초기화 :

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

나는 오전 : 그들은 NumPy와의 전체 목적을 패배로, 루프 일반적으로 피할 수 있습니다 : 같은 가격


, 여기에 후했다 일을 더 numpythonic 방법 python 3.3. 내 코드 조각을 확인 - Tmp 평가에서 0.5가됩니다. – Daniel

+0

편집되었지만 너무 늦었습니다. –