删除零线二维numpy数组

2024-05-16 14:18:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我在numpy中运行qr factorization,它返回ndarrays的列表,即QR

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

Tags: numpy证明示例列表np矩阵数组array
3条回答

如果要删除具有可忽略项的行,我将使用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,:]

由于数据不完全等于零,我们需要为零设置一个阈值,例如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)

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

相关问题 更多 >