2012-06-25 31 views
17

tôi chạy một qr factorization trong numpy mà trả về một danh sách các ndarrays, cụ thể là QR:loại bỏ zero dòng 2-D NumPy mảng

>>> [q,r] = np.linalg.qr(np.array([1,0,0,0,1,1,1,1,1]).reshape(3,3)) 

R là một mảng hai chiều, sau khi xoay zero-dòng ở đáy (thậm chí được chứng minh cho tất cả các ví dụ trong bộ thử nghiệm của tôi):

>>> print r 
[[ 1.41421356 0.70710678 0.70710678] 
[ 0.   1.22474487 1.22474487] 
[ 0.   0.   0.  ]] 

. Bây giờ, tôi muốn chia R trong hai ma trận R_~:

[[ 1.41421356 0.70710678 0.70710678] 
[ 0.   1.22474487 1.22474487]] 

R_0:

[[ 0.   0.   0.  ]] 

(giải nén tất cả zero-lines). Nó có vẻ là gần với giải pháp này: deleting rows in numpy array.

CHỈNH SỬA:
Thậm chí thú vị hơn: np.linalg.qr() trả về n x n -matrix. Không, những gì tôi đã mong đợi:

A := n x m 
Q := n x m 
R := n x m 

Trả lời

37

Sử dụng np.all với một axis luận:

>>> r[np.all(r == 0, axis=1)] 
array([[ 0., 0., 0.]]) 
>>> r[~np.all(r == 0, axis=1)] 
array([[-1.41421356, -0.70710678, -0.70710678], 
     [ 0.  , -1.22474487, -1.22474487]]) 
+1

nếu trục = 0 thì sao? – denfromufa

+1

@denfromufa 'axis = 0' sẽ xóa tất cả các cột * không *. – ecatmur

+2

rõ ràng, vấn đề là bộ lọc này không thể được áp dụng như là cho 'axis = 0', thay vào đó transpose là cần thiết – denfromufa

2

Bởi vì dữ liệu là zero không bằng nhau một cách chính xác, chúng ta cần thiết lập một giá trị ngưỡng cho zero như 1e- 6, sử dụng numpy.all với trục = 1 để kiểm tra các hàng là số không hay không. Sử dụng numpy.where và numpy.diff để lấy các vị trí tách, và gọi numpy.split để chia mảng thành danh sách các mảng.

import numpy as np 
[q,r] = np.linalg.qr(np.array([1,0,0,0,1,1,1,1,1]).reshape(3,3)) 
mask = np.all(np.abs(r) < 1e-6, axis=1) 
pos = np.where(np.diff(mask))[0] + 1 
result = np.split(r, pos) 
+0

Bạn nghĩ, 1e-6 phải đủ chính xác cho hầu hết các mục đích? Tôi có nên học nhân vật này không? –

+0

@MillaWell độ chính xác luôn phụ thuộc vào ứng dụng. Ví dụ, độ chính xác của một milimét là rất tốt cho kỹ thuật dân dụng, nhưng rất nghèo cho kỹ thuật cơ khí, và hơi ngớ ngẩn cho thiên văn học, ví dụ. – heltonbiker

1

Nếu bạn muốn loại bỏ các hàng có mục nhập không đáng kể, tôi sẽ sử dụng np.allclose.

zero_row_indices = [i for i in r.shape[0] if np.allclose(r[i,:],0)] 
nonzero_row_indices =[i for i in r.shape[0] if not np.allclose(r[i,:],0)] 
r_new = r[nonzero_row_indices,:] 
Các vấn đề liên quan