如何有条件地沿 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]]])
我正在寻找一种有效的 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]]])