替换通过索引数组

时间:2018-02-25 19:07:59

标签: python numpy multidimensional-array

我想用我拥有的值替换多维数组中的某些列。我尝试了以下内容。

cols_to_replace = np.array([1, 2, 2, 2])

original_array = np.array([[[255, 101,  51],
    [255, 101, 153],
    [255, 101, 255]],

   [[255, 153,  51],
    [255, 153, 153],
    [255, 153, 255]],

   [[255, 203,  51],
    [255, 204, 153],
    [255, 205, 255]],

   [[255, 255,  51],
    [255, 255, 153],
    [255, 255, 255]]], dtype=int)

只用(0, 0, 255)

替换cols

我希望我可以使用数组cols_to_replace

索引所有列
 original_array[:, cols_to_replace] = (0, 0, 255)

这给出了错误的答案!

意外输出。

array([[[255, 101,  51],
    [  0,   0, 255],
    [  0,   0, 255]],

   [[255, 153,  51],
    [  0,   0, 255],
    [  0,   0, 255]],

   [[255, 203,  51],
    [  0,   0, 255],
    [  0,   0, 255]],

   [[255, 255,  51],
    [  0,   0, 255],
    [  0,   0, 255]]])

我的预期输出

array([[[255, 101,  51],
    [  0,   0, 255],
    [255, 101, 255]],

   [[255, 153,  51],
    [255, 153, 153],
    [  0,   0, 255]],

   [[255, 203,  51],
    [255, 204, 153],
    [  0,   0, 255]],

   [[255, 255,  51],
    [255, 255, 153],
    [  0,   0, 255]]])
  • 真正发生了什么?

  • 我如何完成我想要做的事情(即每个行中的access,col 1,col 2,col 2,col 2并替换值。

  • 如果我想删除这些列,是否有numpy方法可以执行此操作?

1 个答案:

答案 0 :(得分:2)

您的预期输出由以下产生:

>>> original_array[np.arange(cols_to_replace.size), cols_to_replace] = 0, 0, 255

这与您的原始方法不同,因为高级索引和切片索引是“单独”评估的。通过将:更改为arange,我们将第0个维度切换为高级索引,以便cols_to_replace在第0个坐标中逐个元素与0, 1, 2, ...配对。

您可以使用如下掩码删除您的选择:

>>> mask = np.ones(original_array.shape[:2], bool)
>>> mask[np.arange(cols_to_replace.size), cols_to_replace] = False
>>> original_array[mask].reshape(original_array.shape[0], -1, original_array.shape[2])
array([[[255, 101,  51],
        [255, 101, 255]],

       [[255, 153,  51],
        [255, 153, 153]],

       [[255, 203,  51],
        [255, 204, 153]],

       [[255, 255,  51],
        [255, 255, 153]]])