我有一堆矩阵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)
其中eq1
,eq2
,eq3
等是大方形矩阵。正如您所看到的,有许多nan
个元素围绕着可绘制值的“块”。我想删除所有nan
值,同时保持矩阵中有效值块的形状。请注意,这些“块”可以位于eq1
,eq2
矩阵中的任何位置。
我查看了Removing nan values from an array和Removing NaN elements from a matrix中给出的答案,但这些答案似乎与我的案例完全无关。
答案 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