这是获得所需内容的矢量化方式。
从您的示例中获取a:
a[(a < 0.2).any(axis=1).any(axis=1)] = 0.2
print(a)
给予:
array([[[ 0.2 , 0.2 , 0.2 ],
[ 0.2 , 0.2 , 0.2 ],
[ 0.2 , 0.2 , 0.2 ]],
[[ 0.28983508, 0.31122743, 0.67818926],
[ 0.42720309, 0.24416101, 0.5469823 ],
[ 0.22894097, 0.76159389, 0.80416832]],
[[ 0.25661154, 0.64389696, 0.37555374],
[ 0.87871659, 0.27806621, 0.3486518 ],
[ 0.26388296, 0.8993144 , 0.7857116 ]]])
说明:
再举一个例子,每一步都会更清楚:
a = np.array([[[0.51442898, 0.90447442, 0.45082496],
[0.59301203, 0.30025497, 0.43517362],
[0.28300437, 0.64143037, 0.73974422]],
[[0.228676 , 0.59093859, 0.14441217],
[0.37169639, 0.57230533, 0.81976775],
[0.95988687, 0.43372407, 0.77616701]],
[[0.03098771, 0.80023031, 0.89061113],
[0.86998351, 0.39619143, 0.16036088],
[0.24938437, 0.79131954, 0.38140462]]])
让我们看看哪些元素小于0.2:
print(a < 0.2)
给予:
array([[[False, False, False],
[False, False, False],
[False, False, False]],
[[False, False, True],
[False, False, False],
[False, False, False]],
[[ True, False, False],
[False, False, True],
[False, False, False]]])
从这里我们想获得那些至少有一个True元素的二维数组的索引:[False, True, True]。为此,我们需要np.any。请注意,我将在这里使用np.ndarray.any 方法链接,而不是嵌套np.any 的函数调用。 1
现在只使用(a < 0.2).any() 将只给出True,因为默认情况下它对所有维度执行逻辑或。我们必须指定axis 参数。在我们的例子中,axis=1 或 axis=2 都可以。2
print((a < 0.2).any(axis=1))
给3:
array([[False, False, False],
[False, False, True],
[ True, False, True]])
从这里我们通过沿行应用另一个 .any() 来获得所需的布尔索引:
print((a < 0.2).any(axis=1).any(axis=1))
给予:
array([False, True, True])
实际上,我们可以简单地使用这个boolean index array 来替换原始数组的值:
a[(a < 0.2).any(axis=1).any(axis=1)] = 0.2
print(a)
给予:
array([[[0.51442898, 0.90447442, 0.45082496],
[0.59301203, 0.30025497, 0.43517362],
[0.28300437, 0.64143037, 0.73974422]],
[[0.2 , 0.2 , 0.2 ],
[0.2 , 0.2 , 0.2 ],
[0.2 , 0.2 , 0.2 ]],
[[0.2 , 0.2 , 0.2 ],
[0.2 , 0.2 , 0.2 ],
[0.2 , 0.2 , 0.2 ]]])
1只比较链式:
a[(a < 0.2).any(axis=1).any(axis=1)] = 0.2
有嵌套:
a[np.any(np.any(a < 0.2, axis=1), axis=1)] = 0.2
我认为后者更令人困惑。
2对我来说,起初这很难理解。帮助我的是绘制一个 3x3x3 立方体的图像,打印不同轴的结果,并检查哪个轴对应于哪个方向。此外,这里是在 3D 情况下使用带有 np.sum 的轴的说明:Axis in numpy multidimensional array.
3人们可能期望立即获得[False, True, True],但事实并非如此。解释见:Small clarification needed on numpy.any for matrices