簡體   English   中英

使用OR將3D布爾數組簡化為2D

[英]Using OR to reduce a 3D boolean array to 2D

我有一個3D布爾數組(5830L, 6447L, 4L) ,我想通過在第3維(4L)使用OR布爾運算符將其簡化為(5830L, 6447L) (4L) 因此,我將對4L 2D數組進行逐元素比較。 一個簡單的一維示例將類似於:

a = [True, False, True]
b = [False, False, True]
c = [True, False, True]
mask = [any(tup) for tup in zip(a, b, c)]
print mask
'True, False, True'

第3維的大小可以變化,因此我需要在for循環中運行它,或以這樣的方式運行它,即第3維的大小不像上面那樣被硬編碼。 numpy.logical_or(a, b)效果很好,但僅適用於2個數組元素( 2L )。

任何理想的情況,當其包含3個或更多元素時如何執行此操作; 即三維尺寸> 2L

兩個選項:使用.reduce ufunc方法 ,或使用any 方法 (與對布爾值的重復OR相同):

In [195]: x = np.random.choice([False, True], (5830, 6447, 4))

In [196]: via_reduce = np.logical_or.reduce(x, axis=2)

In [197]: via_any = x.any(axis=2)

In [198]: via_manual = np.logical_or(np.logical_or(np.logical_or(x[..., 0], x[..., 1]), x[..., 2]), x[...,3])

In [199]: np.allclose(via_reduce, via_any)
Out[199]: True

In [200]: np.allclose(via_reduce, via_manual)
Out[200]: True

老實說,我期望.any會更快,但是這里並沒有太大的區別:

In [201]: %timeit via_reduce = np.logical_or.reduce(x, axis=2)
883 ms ± 2.99 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [202]: %timeit via_any = x.any(axis=2)
895 ms ± 7.16 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM