2012-06-25 12 views
17

を削除:I、すなわち<code>Q</code>と<code>R</code>、<code>ndarrays</code>のリストを返す<code>numpy</code>に<code>qr factorization</code>を実行ゼロライン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.  ]] 

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

R_0:(すべてゼロの行を抽出する)

[[ 0.   0.   0.  ]] 

今、私は2つの行列R_~Rを分割したいです。それはこの解決策に近いと思われる:deleting rows in numpy array

編集:
さらに興味深い:np.linalg.qr()n x n -matrixを返します。 、どのような私が期待したではない:

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

何軸= 0の場合? – denfromufa

+1

軸= 0 'すべてゼロ*列を削除でしょう* '@denfromufa。明白である – ecatmur

+2

は、どのような問題があることは軸= '0'のためであるとして、このフィルタリングは適用できないということで、代わりに移調 – denfromufa

2

データが正確にゼロではありません、我々はそのような1E-としてゼロのしきい値を設定する必要があるため6、numpy.allをaxis = 1で使用して、行がゼロであるかどうかをチェックします。分割位置を取得し、アレイのリストに配列を分割するnumpy.splitを呼び出すためにnumpy.whereとnumpy.diffを使用してください。

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

(R == 0、軸= 0)] ' –

+0

@MillaWindow精度は常にアプリケーションに依存します。例えば、1 milimeterの精度は、例えば、土木工学のための非常に良いが、機械工学のための非常に悪い、と天文学のためにやや不合理です。 – 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,:] 
関連する問題