Search code examples
pythonarraysfunctionnumpyboolean-operations

Function working iteratively over each row in an individual column of an array - numpy


I'm looking to change all the values in an array using the following formula:

new_value = old_value * elec_space - elec_space

A complicating issue is that all values above 48 within the array will be increased by two, as 49 & 50 will never exist in the original array (infile, shown below). This means that any value above 48 will have to have 2 subtracted from it before performing the above calculation.

Original values:

elec_space = 0.5

infile = 
[[41,   42,   43,   44]
 [41,   42,   44,   45]
 [41,   43,   45,   47]
 [44,   45,   46,   47]
 [44,   45,   47,   48]
 [44,   46,   48,   52]
 [47,   48,   51,   52]
 [47,   48,   52,   53]
 [47,   51,   53,   55]]

Desired values:

infile =
[[ 20,  20.5,   21,  21.5]
 [ 20,  20.5,  21.5,  22]
 [ 20    21,    22,   23]
 [21.5,  22,   22.5,  23]
 [21.5   22,    23,  23.5]
 [21.5, 22.5,  23.5, 24.5]
 [ 23,  23.5,   24,  24.5]
 [ 23,  23.5,  24.5,  25]
 [ 23,   24,    25,   26]]

I've tried:

def remove_missing(infile):
    if infile > 48:
        return (infile - 2) * elec_space - elec_space
    else:
        return infile * elec_space - elec_space
A = remove_missing(infile[:,0])
B = remove_missing(infile[:,1])
M = remove_missing(infile[:,2])
N = remove_missing(infile[:,3])
infile = np.column_stack((A, B, M, N))

And:

def remove_missing(infile):
    return (infile - 2) * elec_space - elec_space if infile > 50 else infile * elec_space - elec_space
A = remove_missing(infile[:,0])
B = remove_missing(infile[:,1])
M = remove_missing(infile[:,2])
N = remove_missing(infile[:,3])

But got the following traceback for each of them:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-181-dcc8e29a527f> in <module>()
      4     else:
      5         return infile * elec_space - elec_space
----> 6 A = remove_missing(infile[:,0])
      7 B = remove_missing(infile[:,1])
      8 M = remove_missing(infile[:,2])

<ipython-input-181-dcc8e29a527f> in remove_missing(infile)
      1 def remove_missing(infile):
----> 2     if infile > 48:
      3         return (infile - 2) * elec_space - elec_space
      4     else:
      5         return infile * elec_space - elec_space

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 




---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-180-c407ec4fa95d> in <module>()
      2     return (infile - 2) * elec_space - elec_space if infile > 50 else infile * elec_space - elec_space
      3 
----> 4 A = remove_missing(infile[:,0])
      5 B = remove_missing(infile[:,1])
      6 M = remove_missing(infile[:,2])

<ipython-input-180-c407ec4fa95d> in remove_missing(infile)
      1 def remove_missing(infile):
----> 2     return (infile - 2) * elec_space - elec_space if infile > 50 else infile * elec_space - elec_space
      3 
      4 A = remove_missing(infile[:,0])
      5 B = remove_missing(infile[:,1])

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

I don't think a.any or a.all are the right options, as I want the function to run iteratively for each row in the column of the array, not to alter all values based on one of the values being over 48.

Has anyone got any pointers on how best to tackle this, please?


Solution

  • One alternative approach could be to subtract 1 for elements that were greater than 48 from the result, like so -

    (infile - 2*(infile>48))* elec_space - elec_space