我正在使用分类器的预测,使用一个dataframe,在输入算法之前我删除了NaN值。在预测之后,我想创建一个新的数组,如果原始dataframe中有一个有效的点,它将接受预测,在其他情况下,事情变得复杂:如果 Dataframe 中存在NaN值,则必须检查其他两个 Dataframe ,并从具有有效值的 Dataframe 中取出点。
我需要的一个例子:
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
,但在False
中有False``mask_x
,它将采用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])
我需要弄清楚如何使最后一部分使用掩码而不是循环,以有效的方式处理大型数组。
先谢谢你了。
1条答案
按热度按时间ckx4rj1h1#
你可以使用
np.where
来实现,也许还有更快的方法,但是这个方法非常简单。首先你用所有的
np.nan
初始化数组,这应该可以保存最后一步。然后你只需要使用np.where
来检查你的条件:(Also我认为在你的例子中有一个错误,
mask_z
和mask_x
应该这样定义:)