0

我有以下数组:

[(True,False,True), (False,False,False), (False,False,True)]

如果任何元素包含 True 那么它们都应该是 true。所以上面应该变成:

[(True,True,True), (False,False,False), (True,True,True)]

我下面的代码尝试这样做,但它只是将所有元素转换为 True:

a = np.array([(True,False,True), (False,False,False), (False,True,False)], dtype='bool')
aint = a.astype('int')
print(aint)
aint[aint.sum() > 0] = (1,1,1)
print(aint.astype('bool'))

输出是:

[[1 0 1]
 [0 0 0]
 [0 1 0]]

[[ True  True  True]
 [ True  True  True]
 [ True  True  True]]
4

4 回答 4

2

您可以尝试np.any,它测试沿给定轴的任何数组元素的计算结果是否为 True

这是使用列表推导来获得预期结果的快速代码行。

lst = [(True,False,True), (False,False,False), (False,False,True)]
result = [(np.any(x),) * len(x) for x in lst]

# result is [(True, True, True), (False, False, False), (True, True, True)]
于 2019-07-10T00:23:07.887 回答
0

我不是numpy巫师,但这应该返回你想要的。

import numpy as np

def switch(arr):
    if np.any(arr):
        return np.ones(*arr.shape).astype(bool)
    return arr.astype(bool)

np.apply_along_axis(switch, 1, a)

array([[ True,  True,  True],
       [False, False, False],
       [ True,  True,  True]])
于 2019-07-10T00:28:22.507 回答
0

True根据原始数组的第二维创建一个 ' 数组,并将其分配给其中包含 aTrue的所有行。

>>> a
array([[ True, False,  True],
       [False, False, False],
       [False,  True, False]])

>>> a[a.any(1)] = np.ones(a.shape[1], dtype=bool)
>>> a
array([[ True,  True,  True],
       [False, False, False],
       [ True,  True,  True]])
>>>

依靠广播

于 2019-07-10T02:07:38.003 回答
0

ndarray.any一起axis=1完成np.tile工作

np.tile(a.any(1)[:,None], a.shape[1])

array([[ True,  True,  True],
       [False, False, False],
       [ True,  True,  True]])
于 2019-07-10T00:49:13.550 回答