2013-01-17 58 views
6

Tôi muốn tạo một ma trận thưa thớt với mảng numpy. Các mảng NumPy chứa NaN như zero cho chương trình của tôi, mã để ký tắt một ma trận thưa thớt như sau:cách nhanh nhất để khởi tạo ma trận scipy.sparse với numpy.NaN là gì?

a= np.array([[np.NaN,np.NaN,10]]) 
zero_a= np.array([[0,0,10]]) 
spr_a = lil_matrix(a) 
zero_spr_a = lil_matrix(zero_a) 
print repr(spr_a) 
print repr(zero_spr_a) 

đầu ra là

 
1x3 sparse matrix of type 'type 'numpy.float64'' 
    with 3 stored elements in LInked List format 
1x3 sparse matrix of type 'type 'numpy.int64'' 
    with 1 stored elements in LInked List format 

cho mảng với 0, chỉ có 1 phần tử lưu trữ trong thưa thớt ma trận. nhưng có 3 phần tử được lưu trữ trong mảng NaN, cách xử lý NaN bằng 0 cho ma trận scipy?

Trả lời

2

Việc sử dụng số không làm giá trị rỗng trong ma trận thưa thớt được ăn sâu trong mã, do đó rất tiếc là không dễ thay đổi.

Trước tiên, tôi sẽ xem xét lại nhu cầu xử lý NaN hoặc giá trị khác làm giá trị trống trong ma trận thưa thớt. Có lẽ có một cách khác trong mã của bạn?

Nếu bạn thực sự phải thay đổi giá trị rỗng trong ma trận thưa thớt, sau đó bạn sẽ phải xác định một lớp mới dựa trên lil_matrix hoặc thậm chí trên spmatrix. Quan trọng nhất là bạn cần phải thay đổi phương thức get nnz(), trong đó xác định có bao nhiêu điểm khác không. Nhưng bạn cũng cần phải xác định lại ma trận, bởi vì vì nó được đúc như là một np.matrix của đối tượng dtype, và các zero được xóa trong quá trình này.

4

Nếu tất cả những gì bạn muốn làm là tạo một ma trận thưa thớt từ dữ liệu của bạn, hãy xử lý các số NaN s như thể chúng là số không, bạn có thể làm như sau. Thứ nhất, cho phép tạo ra một mảng ngẫu nhiên với một số np.nan s trong đó:

>>> nans = np.random.randint(0, 2, size=(5,5)) 
>>> a = np.ones((5,5)) 
>>> a = np.where(nans, np.nan, a) 
>>> a 
array([[ 1., 1., 1., 1., nan], 
     [ nan, nan, nan, 1., 1.], 
     [ nan, nan, 1., 1., nan], 
     [ 1., 1., 1., 1., nan], 
     [ 1., nan, 1., nan, nan]]) 

Để làm điều này thưa thớt ở định dạng COO, nó là dễ dàng như:

>>> indices = np.nonzero(~np.isnan(a)) 
>>> sps = scipy.sparse.coo_matrix((a[indices], indices), shape=a.shape) 
>>> sps 
<5x5 sparse matrix of type '<type 'numpy.float64'>' 
    with 14 stored elements in COOrdinate format> 

Và để kiểm tra họ đều giống nhau:

>>> sps.toarray() 
array([[ 1., 1., 1., 1., 0.], 
     [ 0., 0., 0., 1., 1.], 
     [ 0., 0., 1., 1., 0.], 
     [ 1., 1., 1., 1., 0.], 
     [ 1., 0., 1., 0., 0.]]) 

Mặc dù NaN s của bạn bây giờ đã mất hết ...

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