按逻辑规则用 1-dim np.darrays 有效地替换 np.darray 值?

Efficiently replace np.darray values with 1-dim np.darrays by logical rule?

我想用表示 RGB 像素的一维数组替换 np.darray 值。

例如:

array([[0.7, 0.2],
       [0.1, 0.4]])

根据规则 array_value > 0.5 转换为

array([[[255, 255, 255],
        [  0,   0,   0]],
       [[  0,   0,   0],
        [  0,   0,   0]]])

有没有比np.apply_along_axis更省时的方法?

我可以用np.apply_along_axis,但是这个方法比较慢:

values = np.array([[0.7, 0.2], 
                   [0.1, 0.4]])

pixel_0 = np.array([0, 0, 0])
pixel_1 = np.array([255, 255, 255])
replace_scalar_by_RGB_pixel = lambda x: pixel_1 if x > 0.5 else pixel_0

np.apply_along_axis(replace_scalar_by_RGB_pixel, 2, np.expand_dims(values, 2))

Output: 
array([[[255, 255, 255],
        [  0,   0,   0]],
       [[  0,   0,   0],
        [  0,   0,   0]]])

您可以使用布尔数组索引创建一个具有预期形状和替换像素的新数组,如下所示:

values = np.array([[0.7, 0.2], [0.1, 0.4]])
pixel_0 = np.array([0, 0, 0])
pixel_1 = np.array([255, 255, 255])
shape = values.shape
output = np.zeros((shape[0], shape[1], 3))
output[values > 0.5] = pixel_1
output[values <= 0.5] = pixel_0

这就是 np.where 的用途:

>>> np.where(values[...,None]>0.5,pixel_1,pixel_0)
array([[[255, 255, 255],
        [  0,   0,   0]],

       [[  0,   0,   0],
        [  0,   0,   0]]])