【问题标题】:Using OR to reduce a 3D boolean array to 2D使用 OR 将 3D 布尔数组缩减为 2D
【发布时间】:2018-09-10 17:08:54
【问题描述】:

我有一个 3D 布尔数组 (5830L, 6447L, 4L),我想通过在第三维 (4L) 上使用 OR 布尔运算符将其简化为 (5830L, 6447L)。因此,我将对4L 2D 数组进行逐个元素的比较。一个简单的 1D 示例如下所示:

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'

第三维的大小可能会有所不同,因此我需要在for 循环中运行它,或者以第三维的大小不像上面那样硬编码的方式运行它。 numpy.logical_or(a, b) 效果很好,但仅适用于 2 个数组元素 (2L)。

当它有 3 个或更多元素时,任何理想的方法;即第三维是 > 2L?

【问题讨论】:

    标签: python numpy multidimensional-array boolean boolean-logic


    【解决方案1】:

    两个选项:使用.reduce ufunc method,或使用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)
    

    【讨论】:

      猜你喜欢
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多