2012-06-25 61 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,:]