41

我运行一个返回列表qr factorization,即和:numpyndarraysQR

>>> [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.        ]]

(提取所有零线)。它似乎接近这个解决方案:删除 numpy array 中的行

编辑:
更有趣的是:np.linalg.qr()返回一个n x n-matrix。不是,我所期望的:

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

4 回答 4

96

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]])
于 2012-06-25T11:59:49.787 回答
3

因为数据不完全等于零,我们需要为零设置一个阈值,例如 1e-6,使用带有 axis=1 的 numpy.all 来检查行是否为零。使用 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)
于 2012-06-25T12:02:54.250 回答
3

由于这是第一个修剪2D 零线数组的谷歌结果之一,我想添加我的实现以仅删除二维中的前导零和尾随零:

p = np.where(t != 0)
t = t[min(p[0]) : max(p[0]) + 1, min(p[1]) : max(p[1]) + 1]

这假设您的数组被调用t并且 numpy 被导入为np.

于 2021-01-19T19:44:37.533 回答
2

如果您想消除条目可忽略不计的行,我会使用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,:]
于 2017-05-01T13:54:10.323 回答