【问题标题】:remove zero lines 2-D numpy array删除零行二维 numpy 数组
【发布时间】:2012-06-26 15:37:44
【问题描述】:

我在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-matrix。不是,如我所料:

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

【问题讨论】:

    标签: python multidimensional-array numpy


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案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,:]
      

      【讨论】:

        【解决方案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)
        

        【讨论】:

        • 您认为 1e-6 对于大多数用途应该足够精确?我应该学习这个参数吗?
        • @MillaWell 精度始终取决于应用程序。例如,一毫米的精度对于土木工程来说非常好,但对于机械工程来说就很差,例如对于天文学来说有些荒谬。
        • numpy 现在有np.allclose 函数可以使代码更具可读性docs.scipy.org/doc/numpy/reference/generated/…
        【解决方案4】:

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

        【讨论】:

        • @denfromufa axis=0 将删除全零的
        • 很明显,问题是不能像axis=0那样应用这种过滤,而是需要转置
        • @denfromufa 哦对了,需要在1轴上做下标:r[:, np.all(r == 0, axis=0)]
        • @denfromufa 或 s.compress(np.all(s == 0, axis=0), axis=1)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-08
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 2023-03-31
        • 2017-08-09
        • 1970-01-01
        相关资源
        最近更新 更多