0

我的数据是几个长度相同的数据数组。我正在屏蔽一个数组(y),然后使用该屏蔽数组来屏蔽第二个数组(x)。我屏蔽 x 以消除指示设备错误 (-9999) 的值。然后我使用 np.where() 找出 y 低的位置(低于平均值 1 个标准偏差)来掩盖 x,以便在 y 低时查看 x 的值。

我已经尝试多次更改我的掩码,但其他 numpy 掩码数组操作都没有给我不同的结果。当掩码 = FALSE 时,我尝试编写一个逻辑语句来给我值,但我不能在 np.where() 语句中这样做。

x = np.array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] )
y = np.array( [ 0, 1, -9999, 3, 4, 5, 6, 7, 8, -9999, 10 ] )

x = np.ma.masked_values( x, -9999 )
y = np.ma.masked_values( y, -9999 )

low_y = ( y.mean() - np.std( y ) )

x_masked = x[ np.where( y < low_y ) ]

当我们调用 x_masked 时,它返回:

>>>x_masked
masked_array(data=[0, 1, 2, 9],
         mask=False,
   fill_value=-9999)

我们期望 x_masked 的平均值为 0.5( (0 + 1)/2 ),但平均值为 3,因为 x_masked 中包含了掩码的 -9999 值(2 和 9)。

有没有办法排除屏蔽值以便只获取未屏蔽值?

4

2 回答 2

1

我想你想掩盖xwhere y != -9999。如果您对代码进行此更改,它将按预期工作。

您也可以只使用np.where掩码。

x = x[np.where(y != -9999)]
y = y[np.where(y != -9999)]

low_y = ( y.mean() - np.std( y ) )

x_masked = x[np.where( y < low_y)]
print (x_masked)
[0 1]
于 2019-09-11T18:07:29.567 回答
1

从 1.8 版开始添加 numpynanstdnanmean处理丢失的数据。在您的情况下,因为 -9999 用于指示错误状态,根据定义,我认为这是一个很好的用例numpy.nan

In [76]: y = np.where(y==-9999, np.nan, y)

In [77]: low_y = (np.nanmean(y) - np.nanstd(y))

In [78]: low_y
Out[78]: 1.8177166753143883

In [79]: x_masked = x[ np.where( y < low_y ) ]  # [0, 1]
于 2019-09-11T23:35:55.587 回答