如何有条件地沿 numpy ndarray 的特定轴在特定位置设置值

How to conditionally set values at a particular position along a particular axis of a numpy ndarray

我正在寻找一种有效的 pythonic 方法来根据条件测试在 ndarray 中沿单个轴设置第 n 个值。这是一个例子。

初始ndarray:

array([[[111, 112, 113, 114],
        [121, 122, 123, 124]],

       [[211, 212, 213, 214],
        [221, 222, 223, 224]],

       [[311, 312, 313, 314],
        [321, 322, 323, 324]]])

我想测试沿着最内轴(轴 2)的第 2 个位置的项目,换句话说,就是这个例子中恰好以 3 结尾的所有数字。如果数字低于截止值值,我们假设为 215,然后将值设置为 0。

结果如下:

array([[[111, 112, 0, 114],
        [121, 122, 0, 124]],

       [[211, 212, 0, 214],
        [221, 222, 223, 224]],

       [[311, 312, 313, 314],
        [321, 322, 323, 324]]])

我尝试了布尔索引、numpy.where 等的组合,但是在使用花式索引的同时沿特定轴隔离第 n 个项目似乎至少是一个复杂程度,超出了我能找到的任何示例。我希望这是一个有趣的问题,非常感谢您的帮助。

要访问轴 0 上的所有第二列,请使用 [:,:,2](或 a[...,2]):

a[:,:,2]

array([[113, 123],
       [213, 223],
       [313, 323]])

要根据某些条件(例如 < 215)更改这些值,您可以执行以下操作:

mask = a[:,:,2] < 215
a[:,:,2][mask] = 0

结果:

array([[[111, 112,   0, 114],
        [121, 122,   0, 124]],

       [[211, 212,   0, 214],
        [221, 222, 223, 224]],

       [[311, 312, 313, 314],
        [321, 322, 323, 324]]])