Python 如果满足条件,则替换三维阵列中的二维子阵列
我有一个矩阵,看起来像这样:Python 如果满足条件,则替换三维阵列中的二维子阵列,python,numpy,vectorization,Python,Numpy,Vectorization,我有一个矩阵,看起来像这样: a = np.random.rand(3, 3, 3) [[[0.04331462, 0.30333583, 0.37462236], [0.30225757, 0.35859228, 0.57845153], [0.49995805, 0.3539933, 0.11172398]], [[0.28983508, 0.31122743, 0.67818926], [0.42720309, 0.24416101, 0.5469823 ], [0
a = np.random.rand(3, 3, 3)
[[[0.04331462, 0.30333583, 0.37462236],
[0.30225757, 0.35859228, 0.57845153],
[0.49995805, 0.3539933, 0.11172398]],
[[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 ]]]
我想检查每个块的值是否小于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.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中x的
:
对于x中的y:
对于y中的z:
如果z<0.2:
z=0.2
对于i,枚举(a)中的块:
如果(块<0.2).展平().any():
a[i]=np.one(np.shape(block))*0.2
印刷品(a)
数组([[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
:
a[(a < 0.2).any(axis=1).any(axis=1)] = 0.2
print(a)
a[(a < 0.2).any(axis=1).any(axis=1)] = 0.2
print(a)
说明: 再举一个例子,每个步骤都会更加清晰:
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)
从这里,我们希望获得至少有一个True
元素的2D数组的索引:[False,True,True]
。我们需要这个。注意,我将在这里使用方法链接,而不是嵌套np.any
的函数调用。一,
现在只需使用(a<0.2)。any()
将只给出True
,因为默认情况下,它在所有维度上执行逻辑OR。我们必须指定轴
参数。在我们的例子中,我们可以使用axis=1
或axis=2
.2
从这里,我们通过沿行应用另一个.any()
来获得所需的布尔索引:
print((a < 0.2).any(axis=1).any(axis=1))
最后,我们可以简单地使用它来替换原始数组的值:
1只需比较链接:
a[(a < 0.2).any(axis=1).any(axis=1)] = 0.2
a[(a<0.2).任意(轴=1).任意(轴=1)]=0.2
使用嵌套:
a[np.any(np.any(a < 0.2, axis=1), axis=1)] = 0.2
a[np.any(np.any)(a<0.2,轴=1,轴=1)]=0.2
我认为后者更令人困惑
2对我来说,起初这很难理解。帮助我的是画一个3x3x3立方体的图像,打印不同轴的结果,并检查哪个轴对应于哪个方向。此外,以下是在3D情况下使用axis withnp.sum
的说明:
3人们可以期望立即得到
[假、真、真]
,但事实并非如此。有关说明,请参见:numpy效率的关键是一次对整个数组执行矢量化操作,而不是使用嵌套循环。而且,这不是OP所要求的。
print((a < 0.2).any(axis=1))
array([[False, False, False],
[False, False, True],
[ True, False, True]])
print((a < 0.2).any(axis=1).any(axis=1))
array([False, True, True])
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 ]]])
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