2013-02-22 43 views
5

Là một bài tập nhỏ trước khi tôi bắt đầu chơi với mã số trong python Tôi đang cố tạo một thuật toán LDLT. Chỉ để "có được bàn chân ướt".Chỉ định giá trị mảng Numpy cơ bản

Tuy nhiên, tôi dường như thiếu kiến ​​thức cơ bản về mảng mờ. Xem ví dụ sau:

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) 

Ví dụ này không phải là mã đầy đủ mà tôi đang làm việc. Tuy nhiên, hãy thử và chạy nó, và thiết lập một break-break tại Matrix [col, D] = ...

Điều tôi mong đợi cho đánh giá đầu tiên là hàng 0 cột 1 (giá trị bắt đầu là -1) đặt bằng = -1 * (1/2) = -0,5.

Tuy nhiên khi chạy mã có vẻ như được đặt bằng 0. Tại sao? Phải có điều gì đó cơ bản mà tôi chưa thực sự hiểu?

Xin cảm ơn trước vì tất cả các bạn đã giúp tôi.

EDIT 1:

Python Ver .: 3.3 Tmp .: trở 0,5 (Theo báo cáo của debugger của tôi).

Trả lời

3

Sau đây có thể hiển thị những gì đang xảy ra:

>>> 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 

mảng của bạn chỉ có thể giữ nguyên 32-bit, vì vậy bất kỳ giá trị dấu chấm bạn cố gắng gán nó sẽ được cast, tức là cắt ngắn, thành int32.


Đối với cùng một mức giá, đây là một cách numpythonic hơn để làm những gì bạn đang theo đuổi: cho vòng thường để tránh được, khi họ đánh bại toàn bộ mục đích của 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

Yup. Cảm ơn rất nhiều - Đã lâu rồi tôi đã tình cờ gặp chuyện đó. – Daniel

0

numpy mảng có loại cố định. Bạn không thể thay đổi mảng int để nổi sau này. Khởi tạo mảng như một mảng phao:

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

Tôi đang trên python 3.3. Kiểm tra đoạn mã của tôi - Tmp trở thành 0.5 khi đánh giá. – Daniel

+0

Đã chỉnh sửa nhưng đã quá muộn :) –

Các vấn đề liên quan