我正在尝试对 3D 数组中切片的阈值进行矢量化。 不幸的是,阈值被应用于维度中的所有 3 个值。 我能想到的唯一方法是提取切片 1,进行处理,然后将其放回数组中,但我确信有更好的方法。 这里有一些代码来解释我在做什么和我想做什么。 非常感谢您的帮助。 J
import numpy as np
arr = np.arange(18).reshape(3, 2, 3)
arr[ arr[:,:,1] < 10 ] = 0
给予:
array([[[ 0, 0, 0],
[ 0, 0, 0]],
[[ 0, 0, 0],
[ 9, 10, 11]],
[[12, 13, 14],
[15, 16, 17]]])
我希望:
array([[[ 0, 0, 2],
[ 3, 0, 5]],
[[ 6, 0, 8],
[ 9, 10, 11]],
[[12, 13, 14],
[15, 16, 17]]])
请您参考如下方法:
这应该有效:
arr[:, :, 1][arr[:, :, 1] < 10] = 0
这将为 arr 的维度 3 的第二个元素创建一个 bool 掩码与:arr[:, :, 1] < 10 .然后使用此 bool 掩码仅索引其特定的数组切片。
使最后一个维度的选择更具可读性的一个很好的功能是省略号 ... .它将在显式索引轴之前对所有轴进行切片。
print(arr[..., 1])
# Out: array([[ 1, 4],
[ 7, 10],
[13, 16]])
在这种情况下,您可以像这样使用它:
slc = (..., 1)
arr[slc][arr[slc] < 10] = 0
