sazr
sazr

Reputation: 25928

Detect if any value is above zero and change it

I have the following array:

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

If any element contains a True then they should all be true. So the above should become:

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

My below code attempts to do that but it simply converts all elements to 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'))

The output is:

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

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

Upvotes: 0

Views: 230

Answers (4)

wwii
wwii

Reputation: 23763

Create an array of True's based on the original array's second dimension and assign it to all rows that have a True in it.

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

Relies on Broadcasting.

Upvotes: 0

Andy L.
Andy L.

Reputation: 25259

ndarray.any along axis=1 and np.tile will get job done

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

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

Upvotes: 0

gold_cy
gold_cy

Reputation: 14226

I'm no numpy wizard but this should return what you want.

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

Upvotes: 0

rohanphadte
rohanphadte

Reputation: 1018

You could try np.any, which tests whether any array element along a given axis evaluates to True.

Here's a quick line of code that uses a list comprehension to get your intended result.

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

Upvotes: 2

Related Questions