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

ffscu2ro  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(199)

我正在使用分类器的预测,使用一个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_zmask_x,以便如果在mask_z中有True,但在False中有False``mask_x,它将采用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])

我需要弄清楚如何使最后一部分使用掩码而不是循环,以有效的方式处理大型数组。
先谢谢你了。

ckx4rj1h

ckx4rj1h1#

你可以使用np.where来实现,也许还有更快的方法,但是这个方法非常简单。
首先你用所有的np.nan初始化数组,这应该可以保存最后一步。然后你只需要使用np.where来检查你的条件:
(Also我认为在你的例子中有一个错误,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]))

相关问题