从基质中去除纳米元素

时间:2014-07-29 23:20:49

标签: python numpy matrix nan

我有一堆矩阵eq1eq2等定义为

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)

其中eq1eq2eq3等是大方形矩阵。正如您所看到的,有许多nan个元素围绕着可绘制值的“块”。我想删除所有nan值,同时保持矩阵中有效值块的形状。请注意,这些“块”可以位于eq1eq2矩阵中的任何位置。

我查看了Removing nan values from an arrayRemoving NaN elements from a matrix中给出的答案,但这些答案似乎与我的案例完全无关。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

短而甜蜜,

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

np.isnan返回一个可用于索引原始数组的bool数组。接受它的否定,你会得到非纳米值。

答案 2 :(得分:0)

一种选择是手动迭代网格并检查Nan值。 Nan值很容易被发现,因为将它与自身进行比较将导致False。您可以使用它将所有Nan值设置为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