Python function to quickly compare values of a matrix?

Question:

I’m sorry to be asking a basic question, but I’ve been working on a signal analysis project for which we need to assign a variable based on which quadrant a set of values (n-dimensional vector) lies in. As a biomedical engineer, I’ve been struggling to maybe find a more efficient or "prettier" solution. Currently, the way in which I’m working for a 3 dimensional vector is by doing multiple comparissons:

if (ondas[0]>0)&(ondas[1]>0)&(ondas[2]>0):
    note=1
elif (ondas[0]>0)&(ondas[1]>0)&(ondas[2]<0):
    note=2
elif (ondas[0]>0)&(ondas[1]<0)&(ondas[2]<0):
    note=3
elif (ondas[0]<0)&(ondas[1]<0)&(ondas[2]<0):
    note=4
elif (ondas[0]<0)&(ondas[1]>0)&(ondas[2]<0):
    note=5
elif (ondas[0]<0)&(ondas[1]<0)&(ondas[2]>0):
    note=6
elif (ondas[0]<0)&(ondas[1]>0)&(ondas[2]>0):
    note=7
elif (ondas[0]>0)&(ondas[1]<0)&(ondas[2]>0):
    note=8
else:
    note=0

Where ondas is my array with 3 values. This code works sufficiently well, but I wonder if there’s another way to tackle the problem. I’ve been working well enough with this solution, but I’m open to feedback on the issue.

Asked By: Esteban Romero

||

Answers:

There are many different ways to approach this problem. The easiest is probably to create a boolean value for each axis and store the respective quadrant for each configuration in a dictionary. This is basically the same as what you did, only shorter and clearer:

axis_to_quad = {(0, 0, 0): 1,
                (0, 0, 1): 2,
                (0, 1, 1): 3,
                (1, 1, 1): 4,
                (1, 0, 1): 5,
                (1, 1, 0): 6,
                (1, 0, 0): 7,
                (0, 1, 0): 8}

note = axis_to_quad[(ondas[0] < 0, ondas[1] < 0, ondas[2] < 0)]
Answered By: grottenolm

Not really changing your logic, but replacing & with and, getting rid of lots of parens, adding some whitespace, and using a conditional expression.

note = 1 if ondas[0] > 0 and ondas[1] > 0 and ondas[2] > 0 else 
       2 if ondas[0] > 0 and ondas[1] > 0 and ondas[2] < 0 else 
       3 if ondas[0] > 0 and ondas[1] < 0 and ondas[2] < 0 else 
       4 if ondas[0] < 0 and ondas[1] < 0 and ondas[2] < 0 else 
       5 if ondas[0] < 0 and ondas[1] > 0 and ondas[2] < 0 else 
       6 if ondas[0] < 0 and ondas[1] < 0 and ondas[2] > 0 else 
       7 if ondas[0] < 0 and ondas[1] > 0 and ondas[2] > 0 else 
       8 if ondas[0] > 0 and ondas[1] < 0 and ondas[2] > 0 else 
       9 
Answered By: Chris
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.