用多个数组和多个掩码填充数组



我正在使用分类器的预测,在输入算法之前,我在数据框中删除了NaN值。在预测之后,我想创建一个新的数组,如果原始数据框中有一个有效的点,它将接受预测,在其他情况下,事情变得复杂:如果数据框中有一个NaN值,它必须检查其他两个数据框,并从具有有效值的数据框中取一个点。

我需要的一个例子:

z = np.array([2, 4, 5, 7])
x = np.array([3, 6, 9, 8])
pred_value = 11
mask_z = z[z%2 == 0] # array([True, True, False, False])
mask_x = x[x%2 == 0] # array([False, True, False, True])
mask_pred = np.arary([True, True, False, True])

现在我想创建一个新的数组,并从三个不同的数组中获取值来填充它。假设,在mask_pred中有一个False,我想取pred_value。但是,如果在mask_pred中有True,我需要检查mask_zmask_x,以便如果在mask_z中有True,但在mask_x中有False,它将采用x值(反之亦然)。如果mask_zmask_x都是True,那么它将采用NaN值:

y = np.empty(mask_pred.shape)
y[~mask_pred] = pred_value
# Part to fix:
y[mask_pred] = if mask_z == True and mask_x == False then take x value; 
if mask_z == False and mask_x == True then take z value;
if mask_z == True and mask_x == True then fill with np.NaN
print(y)
array([3, NaN, 11, 7])

我需要弄清楚如何使最后一部分工作与掩码,而不是循环,在一个有效的方式为大数组。

提前感谢。

您可以使用np.where。也许还有更快的方法,但是这个方法非常简单。

首先使用所有np.nan初始化数组,这将节省最后一步。然后使用np.where检查条件:

(我也认为在你的例子中有一个错误,mask_zmask_x应该这样定义:)

mask_z = z%2 == 0 # array([True, True, False, False])
mask_x = x%2 == 0 # array([False, True, False, True])
y = np.full(mask_pred.shape, np.nan)
y[~mask_pred] = pred_value
# Part to fix
y = np.where(mask_pred & mask_z & ~mask_x, x, y)
y = np.where(mask_pred & ~mask_z & mask_x, z, y)
np.testing.assert_allclose(y, np.array([3, np.nan, 11, 7]))