我有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例程)?
答案 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]]]