或者是不同大小的布尔数组

时间:2016-04-22 15:21:56

标签: python python-2.7 numpy multidimensional-array

我有3个1-d布尔数组:

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例程)?

2 个答案:

答案 0 :(得分:4)

我认为你只需要明智地插入新轴并让广播处理剩下的事情:

>>> 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)

答案 1 :(得分:0)

我有一个蛮力的实施,我希望改进:

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]]]