2012-06-25 113 views
17

我運行在numpyqr factorization返回的ndarrays,即QR列表:除去零線2-d numpy的陣列

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

R是一個二維陣列,具有樞轉零線在底部(甚至證明了我的測試集中的所有示例):

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

。現在,我想在兩個矩陣R_~R

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

R_0

[[ 0.   0.   0.  ]] 

(提取出所有的零線)。它似乎接近這個解決方案:deleting rows in numpy array

編輯:
更有趣:np.linalg.qr()返回一個n x n - 矩陣。不是,我本來期望:

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

回答

37

使用np.allaxis說法:

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

如果axis = 0會怎樣? – denfromufa

+1

@denfromufa'axis = 0'會刪除全零*列*。 – ecatmur

+2

這是很明顯的,有什麼問題是這個過濾不能像'axis = 0'那樣應用,而是需要轉置 – denfromufa

2

由於數據不等於零準確,我們需要設定一個閾值,例如1e-零6,使用numpy.all和axis = 1來檢查行是否爲零。使用numpy.where和numpy.diff獲取拆分位置,並調用numpy.split將數組拆分爲數組列表。

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

您認爲,1e-6對於大多數目的應該足夠精確?我應該學習這個參數嗎? –

+0

@MillaWell的精度總是取決於應用程序。例如,對於土木工程來說,精度爲1毫米是非常好的,但對於機械工程來說非常差,例如對於天文學來說有點荒謬。 – heltonbiker

1

如果你想消除具有可忽略不計的條目行,我會使用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,:]