Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果满足条件,则替换三维阵列中的二维子阵列_Python_Numpy_Vectorization - Fatal编程技术网

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 with
np.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