<font size=2 face="sans-serif">I'm not sure I need to dive into cython
or C for this - performance is not an issue for my problem - I just want
a flexible function that will accept scalars or arrays. </font>
<br>
<br><font size=2 face="sans-serif">Both Sebastian's and eat's suggestions
show using indexing to handle the conditional statements in the original
function. The problem I'm having implementing this is in getting the input
arguments and outputs to a common array size. Here's how I can do this
but it seems ugly:</font>
<br>
<br><font size=2 color=#000080 face="Courier New"># t and far are function
arguments which may be scalars or arrays</font>
<br><font size=2 color=#000080 face="Courier New"># ag is the output array</font>
<br><font size=2 color=#000080 face="Courier New"># need to make everything
array with common length</font>
<br><font size=2 color=#000080 face="Courier New">t = np.array(t, ndmin=1)
       # Convert t to an array</font>
<br><font size=2 color=#000080 face="Courier New">far = np.array(far, ndmin=1)
       # Convert far to an array</font>
<br><font size=2 color=#000080 face="Courier New">ag = t*far*np.nan  
               
     # Make an output array of the proper length
using broadcasting rules</font>
<br><font size=2 color=#000080 face="Courier New">t = np.zeros_like(ag)+t
               #
Expand t to the length of the output array</font>
<br><font size=2 color=#000080 face="Courier New">far = np.zeros_like(ag)+far
       # Expand far to the length of the output
array</font>
<br>
<br><font size=2 face="sans-serif">Now with all arrays the same length
I can use indexing with logical statements:</font>
<br><font size=2 color=#000080 face="Courier New">ag[far<0.005] = -3.472487e-22
* t ** 6. + 6.218811e-18 * t ** 5. - 4.428098e-14 * t ** 4. + \</font>
<br><font size=2 color=#000080 face="Courier New">     
          1.569889e-10 * t ** 3. - 0.0000002753524
* t ** 2. + 0.0001684666 * t + 1.368652</font>
<br>
<br><font size=2 face="sans-serif">The resulting code looks like this:</font>
<br><font size=2 color=#000080 face="Courier New">import numpy as np</font>
<br>
<br><font size=2 color=#000080 face="Courier New">def air_gamma_dp(t, far=0.0):</font>
<br><font size=2 color=#000080 face="Courier New">    """</font>
<br><font size=2 color=#000080 face="Courier New">    Specific
heat ratio (gamma) of Air/JP8</font>
<br><font size=2 color=#000080 face="Courier New">    t - static
temperature, Rankine</font>
<br><font size=2 color=#000080 face="Courier New">    [far] -
fuel air ratio [- defaults to 0.0 (dry air)]</font>
<br><font size=2 color=#000080 face="Courier New">    air_gamma
- specific heat ratio</font>
<br><font size=2 color=#000080 face="Courier New">    """</font>
<br><font size=2 color=#000080 face="Courier New">    t = np.array(t,
ndmin=1)</font>
<br><font size=2 color=#000080 face="Courier New">    far = np.array(far,
ndmin=1)</font>
<br><font size=2 color=#000080 face="Courier New">    ag = t*far*np.nan</font>
<br><font size=2 color=#000080 face="Courier New">    t = np.zeros_like(ag)+t</font>
<br><font size=2 color=#000080 face="Courier New">    far = np.zeros_like(ag)+far</font>
<br><font size=2 color=#000080 face="Courier New">    </font>
<br><font size=2 color=#000080 face="Courier New">    far[(far<0.)
| (far>0.069)] = np.nan</font>
<br><font size=2 color=#000080 face="Courier New">    t[(t <
379.) | (t > 4731.)] = np.nan</font>
<br><font size=2 color=#000080 face="Courier New">    ag[(far<0.005)]
= -3.472487e-22 * t ** 6. + 6.218811e-18 * t ** 5. - 4.428098e-14 * t **
4. + </font>
<br><font size=2 color=#000080 face="Courier New">     
                 1.569889e-10
* t ** 3. - 0.0000002753524 * t ** 2. + 0.0001684666 * t + 1.368652</font>
<br><font size=2 color=#000080 face="Courier New">    t[(t <
699.) | (t > 4731.)] = np.nan</font>
<br><font size=2 color=#000080 face="Courier New">    a6 = 4.114808e-20
* far ** 3. - 1.644588e-20 * far ** 2. + 3.103507e-21 * far - 3.391308e-22</font>
<br><font size=2 color=#000080 face="Courier New">    a5 = -6.819015e-16
* far ** 3. + 2.773945e-16 * far ** 2. - 5.469399e-17 * far + 6.058125e-18</font>
<br><font size=2 color=#000080 face="Courier New">    a4 = 4.684637e-12
* far ** 3. - 1.887227e-12 * far ** 2. + 3.865306e-13 * far - 4.302534e-14</font>
<br><font size=2 color=#000080 face="Courier New">    a3 = -0.00000001700602
* far ** 3. + 0.000000006593809 * far ** 2. - 0.000000001392629 * far +
1.520583e-10</font>
<br><font size=2 color=#000080 face="Courier New">    a2 = 0.00003431136
* far ** 3. - 0.00001248285 * far ** 2. + 0.000002688007 * far - 0.0000002651616</font>
<br><font size=2 color=#000080 face="Courier New">    a1 = -0.03792449
* far ** 3. + 0.01261025 * far ** 2. - 0.002676877 * far + 0.0001580424</font>
<br><font size=2 color=#000080 face="Courier New">    a0 = 13.65379
* far ** 3. - 3.311225 * far ** 2. + 0.3573201 * far + 1.372714</font>
<br><font size=2 color=#000080 face="Courier New">    ag[far>=0.005]
= a6 * t ** 6. + a5 * t ** 5. + a4 * t ** 4. + a3 * t ** 3. + a2 * t **
2. + a1 * t + a0</font>
<br><font size=2 color=#000080 face="Courier New">    return
ag</font>
<br>
<br><font size=2 face="sans-serif">I was hoping there was a more elegant
way to do this. </font>
<br>
<br><font size=2 face="Century Gothic">David Parker <br>
Chromalloy - TDAG</font>
<br>
<br>
<br>
<br><font size=1 color=#5f5f5f face="sans-serif">From:      
 </font><font size=1 face="sans-serif">John Salvatier <jsalvati@u.washington.edu></font>
<br><font size=1 color=#5f5f5f face="sans-serif">To:      
 </font><font size=1 face="sans-serif">Discussion of Numerical
Python <numpy-discussion@scipy.org></font>
<br><font size=1 color=#5f5f5f face="sans-serif">Date:      
 </font><font size=1 face="sans-serif">02/01/2011 02:29 PM</font>
<br><font size=1 color=#5f5f5f face="sans-serif">Subject:    
   </font><font size=1 face="sans-serif">Re: [Numpy-discussion]
Vectorize or rewrite function to work with array inputs?</font>
<br><font size=1 color=#5f5f5f face="sans-serif">Sent by:    
   </font><font size=1 face="sans-serif">numpy-discussion-bounces@scipy.org</font>
<br>
<hr noshade>
<br>
<br>
<br><font size=3>Have you thought about using cython to work with the numpy
C-API (</font><a href=http://wiki.cython.org/tutorials/numpy#UsingtheNumpyCAPI><font size=3 color=blue><u>http://wiki.cython.org/tutorials/numpy#UsingtheNumpyCAPI</u></font></a><font size=3>)?
This will be fast, simple (you can mix and match Python and Cython). </font>
<br>
<br><font size=3>As for your specific issue: you can simply cast to all
the inputs to numpy arrays (using asarray </font><a href=http://docs.scipy.org/doc/numpy/reference/generated/numpy.asarray.html><font size=3 color=blue><u>http://docs.scipy.org/doc/numpy/reference/generated/numpy.asarray.html</u></font></a><font size=3>)
to deal with scalars. This will make sure they get broadcast correctly.<br>
</font>
<br><font size=3>On Tue, Feb 1, 2011 at 11:22 AM, <</font><a href=mailto:DParker@chromalloy.com><font size=3 color=blue><u>DParker@chromalloy.com</u></font></a><font size=3>>
wrote:</font>
<br><font size=2 face="sans-serif">Thanks for the advice. </font><font size=3><br>
</font><font size=2 face="sans-serif"><br>
Using Sebastian's advice I was able to write a version that worked when
the input arguments are both arrays with the same length. The code provided
by eat works when t is an array, but not for an array of far. </font><font size=3><br>
</font><font size=2 face="sans-serif"><br>
The numpy.vectorize version works with any combination of scalar or array
input. I still haven't figured out how to rewrite my function to be as
flexible as the numpy.vectorize version at accepting either scalars or
array inputs and properly broadcasting the scalar arguments to the array
arguments. </font><font size=3><br>
</font><font size=2 face="Century Gothic"><br>
David Parker <br>
Chromalloy - TDAG</font><font size=3> <br>
<br>
<br>
</font><font size=1 color=#5f5f5f face="sans-serif"><br>
From:        </font><font size=1 face="sans-serif">eat
<</font><a href=mailto:e.antero.tammi@gmail.com target=_blank><font size=1 color=blue face="sans-serif"><u>e.antero.tammi@gmail.com</u></font></a><font size=1 face="sans-serif">></font><font size=3>
</font><font size=1 color=#5f5f5f face="sans-serif"><br>
To:        </font><font size=1 face="sans-serif">Discussion
of Numerical Python <</font><a href="mailto:numpy-discussion@scipy.org" target=_blank><font size=1 color=blue face="sans-serif"><u>numpy-discussion@scipy.org</u></font></a><font size=1 face="sans-serif">></font><font size=3>
</font><font size=1 color=#5f5f5f face="sans-serif"><br>
Date:        </font><font size=1 face="sans-serif">01/31/2011
11:37 AM</font><font size=3> </font><font size=1 color=#5f5f5f face="sans-serif"><br>
Subject:        </font><font size=1 face="sans-serif">Re:
[Numpy-discussion] Vectorize or rewrite function to work with array inputs?</font><font size=3>
</font><font size=1 color=#5f5f5f face="sans-serif"><br>
Sent by:        </font><a href="mailto:numpy-discussion-bounces@scipy.org" target=_blank><font size=1 color=blue face="sans-serif"><u>numpy-discussion-bounces@scipy.org</u></font></a><font size=3>
<br>
</font>
<hr noshade>
<br><font size=3><br>
<br>
<br>
Hi,<br>
<br>
On Mon, Jan 31, 2011 at 5:15 PM, <</font><a href=mailto:DParker@chromalloy.com target=_blank><font size=3 color=blue><u>DParker@chromalloy.com</u></font></a><font size=3>>
wrote: </font><font size=2 face="sans-serif"><br>
I have several functions like the example below that I would like to make
compatible with array inputs. The problem is the conditional statements
give a <i>ValueError: The truth value of an array with more than one element
is ambiguous. Use a.any() or a.all()</i>. I can use numpy.vectorize, but
if possible I'd prefer to rewrite the function. Does anyone have any advice
the best way to modify the code to accept array inputs? Thanks in advance
for any assistance.</font><font size=3> <br>
  <br>
If I understod your question correctly, then air_gamma could be coded as:
<br>
def air_gamma_0(t, far=0.0): <br>
    """ <br>
    Specific heat ratio (gamma) of Air/JP8 <br>
    t - static temperature, Rankine <br>
    [far] - fuel air ratio [- defaults to 0.0 (dry air)]
<br>
    air_gamma - specific heat ratio <br>
    """ <br>
    if far< 0.: <br>
        return NAN <br>
    elif far < 0.005:<br>
        ag= air_gamma_1(t)<br>
        ag[np.logical_or(t< 379.,
t> 4731.)]= NAN<br>
        return ag<br>
    elif far< 0.069:<br>
        ag= air_gamma_2(t, far)<br>
        ag[np.logical_or(t< 699.,
t> 4731.)]= NAN<br>
        return ag<br>
    else: <br>
        return NAN <br>
Rest of the code is in the attachment. <br>
  <br>
  <br>
My two cents, <br>
eat <br>
<br>
</font><tt><font size=2 color=#000080><br>
<br>
NAN = float('nan')</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
<br>
def air_gamma(t, far=0.0):</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
    """</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
    Specific heat ratio (gamma) of Air/JP8</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
    t - static temperature, Rankine</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
    [far] - fuel air ratio [- defaults to 0.0 (dry air)]</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
    air_gamma - specific heat ratio</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
    """</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
    if far < 0.:</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
        return NAN</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
    elif far < 0.005:</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
        if t < 379. or t > 4731.:</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
            return NAN</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
        else:</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
            air_gamma = -3.472487e-22 * t
** 6. + 6.218811e-18 * t ** 5. - 4.428098e-14 * t ** 4. + 1.569889e-10
* t ** 3. - 0.0000002753524 * t ** 2. + 0.0001684666 * t + 1.368652</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
    elif far < 0.069:</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
        if t < 699. or t > 4731.:</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
            return NAN</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
        else:</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
            a6 = 4.114808e-20 * far ** 3.
- 1.644588e-20 * far ** 2. + </font></tt><a href="tel:+13103507" target=_blank><tt><font size=2 color=blue><u>3.103507</u></font></tt></a><tt><font size=2 color=#000080>e-21
* far - 3.391308e-22</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
            a5 = -6.819015e-16 * far ** 3.
+ 2.773945e-16 * far ** 2. - 5.469399e-17 * far + 6.058125e-18</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
            a4 = 4.684637e-12 * far ** 3.
- 1.887227e-12 * far ** 2. + 3.865306e-13 * far - 4.302534e-14</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
            a3 = -0.00000001700602 * far
** 3. + 0.000000006593809 * far ** 2. - 0.000000001392629 * far + 1.520583e-10</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
            a2 = 0.00003431136 * far ** 3.
- 0.00001248285 * far ** 2. + 0.000002688007 * far - 0.0000002651616</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
            a1 = -0.03792449 * far ** 3.
+ 0.01261025 * far ** 2. - 0.002676877 * far + 0.0001580424</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
            a0 = 13.65379 * far ** 3. - 3.311225
* far ** 2. + 0.3573201 * far + 1.372714</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
            air_gamma = a6 * t ** 6. + a5
* t ** 5. + a4 * t ** 4. + a3 * t ** 3. + a2 * t ** 2. + a1 * t + a0</font></tt><font size=3>
</font><tt><font size=2 color=#000080><br>
    elif far >= 0.069:</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
        return NAN</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
    else:</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
        return NAN</font></tt><font size=3> </font><tt><font size=2 color=#000080><br>
    return air_gamma</font></tt><font size=3> </font><font size=2 face="Century Gothic"><br>
<br>
David Parker <br>
Chromalloy - TDAG</font><font size=3><br>
_______________________________________________<br>
NumPy-Discussion mailing list</font><font size=3 color=blue><u><br>
</u></font><a href="mailto:NumPy-Discussion@scipy.org" target=_blank><font size=3 color=blue><u>NumPy-Discussion@scipy.org</u></font></a><font size=3 color=blue><u><br>
</u></font><a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target=_blank><font size=3 color=blue><u>http://mail.scipy.org/mailman/listinfo/numpy-discussion</u></font></a><font size=3><br>
</font>
<br><font size=1 face="sans-serif">[attachment "air_gamma.py"
deleted by Dave Parker/Chromalloy] </font><tt><font size=2>_______________________________________________</font></tt>
<br><tt><font size=2><br>
NumPy-Discussion mailing list</font></tt><tt><font size=2 color=blue><u><br>
</u></font></tt><a href="mailto:NumPy-Discussion@scipy.org" target=_blank><tt><font size=2 color=blue><u>NumPy-Discussion@scipy.org</u></font></tt></a>
<br><a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target=_blank><tt><font size=2 color=blue><u>http://mail.scipy.org/mailman/listinfo/numpy-discussion</u></font></tt></a><font size=3><br>
</font>
<br><font size=3><br>
_______________________________________________<br>
NumPy-Discussion mailing list</font><font size=3 color=blue><u><br>
</u></font><a href="mailto:NumPy-Discussion@scipy.org"><font size=3 color=blue><u>NumPy-Discussion@scipy.org</u></font></a><font size=3 color=blue><u><br>
</u></font><a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target=_blank><font size=3 color=blue><u>http://mail.scipy.org/mailman/listinfo/numpy-discussion</u></font></a><font size=3><br>
</font>
<br><tt><font size=2>_______________________________________________<br>
NumPy-Discussion mailing list<br>
NumPy-Discussion@scipy.org<br>
</font></tt><a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion"><tt><font size=2>http://mail.scipy.org/mailman/listinfo/numpy-discussion</font></tt></a><tt><font size=2><br>
</font></tt>
<br>