[SciPy-User] Heaviside function in vector form

Michael Sarahan msarahan at gmail.com
Sat Jul 5 23:44:24 EDT 2014


oops, typos (in abs(diff parenthesis), beware.

def Heaviside(x):
    mult = -100.0; diff = mult*(x - Theta_syn);
    output = np.ones_like(x)
    output[x < Theta_syn] = 0
    output[abs(diff) < 50] = 1.0/(1 + np.exp(diff[abs(diff) < 50]))
    return output


On Sat, Jul 5, 2014 at 8:42 PM, Michael Sarahan <msarahan at gmail.com> wrote:

> I think I'd do this with indexing:
>
>
> def Heaviside(x):
>     mult = -100.0; diff = mult*(x - Theta_syn);
>     output = np.ones_like(x)
>     output[x<Theta_syn] = 0
>     output[abs(diff < 50)] = 1.0/(1 + np.exp(diff[abs(diff < 50)]))
>     return output
>
>
> On Sat, Jul 5, 2014 at 8:26 PM, Michael Sarahan <msarahan at gmail.com>
> wrote:
>
>> PS:
>>
>>
>> if abs(diff) < 50: #if x is close to Theta_syn
>>
>> will also fail with this error if x is a vector.
>>
>> The error message suggests any() or all(), which will return a single
>> value representing if any or all of the values are true (respectively) -
>> you might also consider min() or max() as sort of threshold settings, or a
>> sum or mean of the diff vector (it will be a vector if x is a vector).
>>
>>
>> On Sat, Jul 5, 2014 at 8:15 PM, Michael Sarahan <msarahan at gmail.com>
>> wrote:
>>
>>> when you say
>>>
>>> if x < Theta_syn:
>>>
>>> you are trying to figure out the truth value of a vector.  That's what
>>> Numpy is telling you.  It doesn't make sense - only the truth value of a
>>> single value makes sense for an if statement.  Instead, you probably want a
>>> sum or something similar.
>>>
>>> HTH.
>>> Mike
>>>
>>>
>>> On Sat, Jul 5, 2014 at 8:02 PM, Barrett B <barrett.n.b at gmail.com> wrote:
>>>
>>>> I am trying to code the Heaviside function in vector form. There are
>>>> several different versions of this, but essentially, f(x) = 1 whenever x >=
>>>> 0, and f(x) = 0 whenever x < 0. Here is what I have so far (keep in mind, x
>>>> is a vector here):
>>>>
>>>> =========
>>>>
>>>> def Heaviside(x):
>>>>     mult = -100.0; diff = mult*(x - Theta_syn);
>>>> #    print x
>>>>     if abs(diff) < 50: #if x is close to Theta_syn
>>>>         return 1.0/(1 + np.exp(diff))
>>>>     if x < Theta_syn:
>>>>         return 0
>>>>     return 1 #otherwise
>>>> #    return 1.0/(1 + np.exp(diff))
>>>>
>>>> =========
>>>>
>>>> which produces the following error:
>>>>
>>>> ValueError: The truth value of an array with more than one element is
>>>> ambiguous. Use a.any() or a.all()
>>>>
>>>> BTW, if I were to comment out every line except the first and last, it
>>>> runs fine.
>>>>
>>>> See what I'm trying to do? Basically, I want to check whether current
>>>> value of diff is not very large. But I don't know how to do this without
>>>> rewriting the code to include for loops, which is what I've been trying to
>>>> get away from all along?
>>>>
>>>> _______________________________________________
>>>> SciPy-User mailing list
>>>> SciPy-User at scipy.org
>>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20140705/205f7e6a/attachment.html>


More information about the SciPy-User mailing list