[英]Replacing 2D subarray in 3D array if condition is met
我有一個看起來像這樣的矩陣:
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
從你的例子:
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.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])
最后,我們可以簡單地使用這個布爾索引數組來替換原始數組的值:
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
軸的說明: numpy 多維數組中的軸。
3人們可能期望立即得到[False, True, True]
,但事實並非如此。 有關解釋,請參閱: 矩陣的 numpy.any 上的小說明
因為你的矩陣有三層,試試這個(讓你的矩陣是 a):
for x in a:
for y in x:
for z in y:
if z < 0.2:
z=0.2
for i, block in enumerate(a):
if (block < 0.2).flatten().any():
a[i] = np.ones(np.shape(block)) * 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 ]]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.