我正在使用分类器的预测,在输入算法之前,我在数据框中删除了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_z
和mask_x
,以便如果在mask_z
中有True
,但在mask_x
中有False
,它将采用x
值(反之亦然)。如果mask_z
和mask_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_z
和mask_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]))