我在qr factorization
中运行numpy
,返回ndarrays
列表,即Q
和R
:
>>> [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
答案 0 :(得分:60)
将np.all
与axis
参数一起使用:
>>> 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 :(得分:3)
因为数据不完全等于零,我们需要设置一个零的阈值,如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)
答案 2 :(得分: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,:]
答案 3 :(得分:0)
由于这是第一个修剪零线二维数组的谷歌结果之一,我想添加我的实现以仅删除二维中的前导零和尾随零:
p = np.where(t != 0)
t = t[min(p[0]) : max(p[0]) + 1, min(p[1]) : max(p[1]) + 1]
这假设您的数组名为 t
,并且 numpy 被导入为 np
。