2

In a numpy.ndarray like this one:

myarray=
array([[ 0.47174344,  0.45314669,  0.46395022,  0.47440382,  0.50709627,
         0.53350065,  0.5233444 ,  0.49974663,  0.48721607,  0.46239652,
         0.4693633 ,  0.47263569,  0.47591957,  0.436558  ,  0.43335574,
         0.44053621,  0.42814804,  0.43201894,  0.43973886,  0.44125302,
         0.41176999],
       [ 0.46509004,  0.46221505,  0.48824086,  0.50088744,  0.53040384,
         0.53592231,  0.49710228,  0.49821022,  0.47720381,  0.49096272,
         0.50438366,  0.47173162,  0.48813669,  0.45032002,  0.44776794,
         0.43910269,  0.43326132,  0.42064458,  0.43472954,  0.45577299,
         0.43604956]])

I want to count how many cells exceed a given value, let's say 0.5, and set those that don't to 0.0. This is what I do:

count=0 
value=0.5
for i in range(myarray.shape[0]):
   for j in range(myarray.shape[1]):
       if myarray[i][j]<value:
          myarray[i][j]=0 
       elif myarray[i][j]>=value:     
          count=count+1 
percentage=round(100*count/(myarray.shape[0]*myarray.shape[1]),2)

However, I get this error: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(), pointing at the line where I check if myarray[i][j]<value.

Why does this happen and how to fix it? What is the truth value?

3
  • Sounds like your array isn't the shape you think it is. Commented Aug 4, 2016 at 21:46
  • 3
    I was able to run the above snippet without any errors Commented Aug 4, 2016 at 21:49
  • No errors. Same script as yours. Got the percentage value as 16. Commented Aug 4, 2016 at 21:57

3 Answers 3

6

Normally, you can compare two numbers to get a truth value. For example:

elem = 5
if elem < 6:
    # do something

is equivalent to:

if true:
    # do something

However, you can't compare an array to a value. For example:

elem = [5,7]
if elem < 6:
    # this doesn't make sense

Instead, you can get the truth value of whether any or all elements satisfy the condition. For example:

elem = np.array([5,7])
if np.any(elem<6):
    # this is true, because 5 < 6
if np.all(elem<6):
    # this isn't true, because 7 > 6

I ran your example code above and found no error, so I'm not sure what the issue is. But this is what you should look out for. Consider printing the element you are comparing to see if it is an array.


Also, this is a shorter way of doing what you want to do:

myarray = np.array( putarrayhere )
count = sum(myarray >= value)
Sign up to request clarification or add additional context in comments.

Comments

1

Yeah I think your numpy.array has an extra bracket or it is encompassing another array.

Tried Manually set array as

myarray=np.array([[ 0.47174344,  0.45314669,  0.46395022,  0.47440382,  0.50709627,0.53350065,  0.5233444 ,  0.49974663,  0.48721607,  0.46239652, 0.4693633 ,  0.47263569,  0.47591957,  0.436558  ,  0.43335574,0.44053621,  0.42814804,  0.43201894,  0.43973886, 0.44125302, 0.41176999],[ 0.46509004,  0.46221505,  0.48824086,  0.50088744,  0.53040384,0.53592231,  0.49710228,  0.49821022,  0.47720381,  0.49096272,0.50438366,  0.47173162,  0.48813669,  0.45032002,  0.44776794,0.43910269,  0.43326132,  0.42064458,  0.43472954,  0.45577299,0.43604956]])

and the code works

but setting:

myarray=np.array([[[ 0.47174344,  0.45314669,  0.46395022,  0.47440382,  0.50709627,0.53350065,  0.5233444 ,  0.49974663,  0.48721607,  0.46239652, 0.4693633 ,  0.47263569,  0.47591957,  0.436558  ,  0.43335574,0.44053621,  0.42814804,  0.43201894,  0.43973886, 0.44125302, 0.41176999],[ 0.46509004,  0.46221505,  0.48824086,  0.50088744,  0.53040384,0.53592231,  0.49710228,  0.49821022,  0.47720381,  0.49096272,0.50438366,  0.47173162,  0.48813669,  0.45032002,  0.44776794,0.43910269,  0.43326132,  0.42064458,  0.43472954,  0.45577299,0.43604956]]])

yielded similar errors

Comments

1

Regardless the error you can simply do:

myarray[myarray<value]=0
np.count_nonzero(myarray)

to get your desired result

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.