【问题标题】:Or'ing boolean arrays of different sizesOr'ing 不同大小的布尔数组
【发布时间】:2016-08-16 07:29:21
【问题描述】:

我有 3 个一维布尔数组:

a1 = np.ones((2,), dtype=bool)
a2 = np.ones((4,), dtype=bool)
a3 = np.ones((3,), dtype=bool)

a1[1]= False
a2[1:3] = False
a3[1:] = False

a1 => [真假]
a2 => [真假假真]
a3 => [真假假]

我想要的是一个新的 ndarray,它是 len(a1), len(a2), len(a3) 的形状,通过将各个数组的元素组合在一起,结果是:

[[[ True  True  True]
  [ True  True  True]
  [ True  True  True]
  [ True  True  True]]

 [[ True  True  True]
  [ True False False]
  [ True False False]
  [ True  True  True]]]

有没有一种有效的方法来做到这一点(最好使用 numpy 例程)?

【问题讨论】:

  • 所以要清楚,你想要result[i, j, k] == a1[i] | a2[j] | a3[k]
  • @mgilson 是的。
  • 我认为你的第一个数组的声明有一个错字。它应该有两个元素,而不是一个。
  • @rayryeng 确实有。

标签: python python-2.7 numpy multidimensional-array


【解决方案1】:

我认为您只需要明智地插入新轴,然后让广播处理其余部分:

>>> a1 = np.ones((2,), dtype=bool)
>>> a2 = np.ones((4,), dtype=bool)
>>> a3 = np.ones((3,), dtype=bool)
>>> 
>>> a1[1]= False
>>> a2[1:3] = False
>>> a3[1:] = False
>>>
>>> a1[:, None, None] | a2[None, :, None] | a3[None, None, :]
array([[[ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True]],

       [[ True,  True,  True],
        [ True, False, False],
        [ True, False, False],
        [ True,  True,  True]]], dtype=bool)

如果您更喜欢np.newaxis 更好读的方式,您可以使用它来代替None(它是一个别名):

>>> a1[:, np.newaxis, np.newaxis] | a2[np.newaxis, :, np.newaxis] | a3[np.newaxis, np.newaxis, :]
array([[[ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True]],

       [[ True,  True,  True],
        [ True, False, False],
        [ True, False, False],
        [ True,  True,  True]]], dtype=bool)

【讨论】:

    【解决方案2】:

    我希望改进一个蛮力实现:

    a1 = np.ones((2,), dtype=bool)
    a2 = np.ones((4,), dtype=bool)
    a3 = np.ones((3,), dtype=bool)
    
    a1[1] = False
    a2[1:3] = False
    a3[1:] = False
    
    r = np.empty((len(a1), len(a2), len(a3)), bool)
    
    for index in np.ndindex(len(a1), len(lats), len(lons)):
        r[index] = a1[index[0]] | a2[index[1]] | a3[index[2]]
    
    r
    
    print(a1)
    print(a2)
    print(a3)
    print(r)
    

    结果:

    [ True False]
    [ True False False True]
    [ True False False]
    [[[ True  True  True]
      [ True  True  True]
      [ True  True  True]
      [ True  True  True]]
    
     [[ True  True  True]
      [ True False False]
      [ True False False]
      [ True  True  True]]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      相关资源
      最近更新 更多