代码之家  ›  专栏  ›  技术社区  ›  Medulla Oblongata

从矩阵中删除nan元素

  •  0
  • Medulla Oblongata  · 技术社区  · 11 年前

    我有一堆矩阵 eq1 , eq2 等定义如下

    from numpy import meshgrid, sqrt, arange
    # from numpy import isnan, logical_not
    
    xs = arange(-7.25, 7.25, 0.01)
    ys = arange(-5, 5, 0.01)
    x, y = meshgrid(xs, ys)
    
    eq1 = ((x/7.0)**2.0*sqrt(abs(abs(x)-3.0)/(abs(x)-3.0))+(y/3.0)**2.0*sqrt(abs(y+3.0/7.0*sqrt(33.0))/(y+3.0/7.0*sqrt(33.0)))-1.0)
    
    eq2 = (abs(x/2.0)-((3.0*sqrt(33.0)-7.0)/112.0)*x**2.0-3.0+sqrt(1-(abs(abs(x)-2.0)-1.0)**2.0)-y)
    

    哪里 方程式1 , 方程式2 , eq3 等等是大的正方形矩阵。正如你所看到的,有很多 nan 元素包围可绘制值的“块”。我想删除所有 同时保持矩阵中有效值块的形状。请注意,这些“块”可以位于 方程式1 , 方程式2 矩阵

    我看过 Removing nan values from an array Removing NaN elements from a matrix ,但这些似乎与我的情况不完全相关。

    3 回复  |  直到 9 年前
        1
  •  3
  •   DSM    11 年前

    IIUC,您可以使用布尔索引 np.isnan 保留切片。可能有一些更巧妙的方法可以做到这一点,但从以下几点开始:

    >>> eq = np.zeros((5,6)) + np.nan
    >>> eq[2:4, 1:3].flat = [1,np.nan,3,4]
    >>> eq
    array([[ nan,  nan,  nan,  nan,  nan,  nan],
           [ nan,  nan,  nan,  nan,  nan,  nan],
           [ nan,   1.,  nan,  nan,  nan,  nan],
           [ nan,   3.,   4.,  nan,  nan,  nan],
           [ nan,  nan,  nan,  nan,  nan,  nan]])
    

    您可以使用以下方法选择包含数据的行和列

    >>> eq = eq[:,~np.isnan(eq).all(0)]
    >>> eq = eq[~np.isnan(eq).all(1)]
    >>> eq
    array([[  1.,  nan],
           [  3.,   4.]])
    
        2
  •  2
  •   Gabriel    11 年前

    短而甜,

    eq1_c = eq1[~np.isnan(eq1)]
    

    np.isnan 返回可用于索引原始数组的布尔数组。接受它的否定,你会得到非nan值。

        3
  •  0
  •   Andrew Johnson    11 年前

    一个选项是手动遍历网格并检查Nan值。Nan值很容易发现,因为将其与自身进行比较将导致False。例如,可以使用此选项将所有“南”值设置为0.0。

    for x in xrange(len(eq1)):
        for y in xrange(len(eq1[x])):
            v = eq1[x][y]
            if v!=v:
                eq1[x][y] = 0.0