The first input to lambdify should be either a SymPy expression or a list
of SymPy expressions.  I don't know enough about lambdify to know if we
support list of lists of sympy expressions.

In general you won't be able to use lambdify with arbitrary n because the
target expression (the second argument to lambdify) needs to already be
evaluated.

Building off of my previous example

In [6]: result = simplify(E(prod(Xs)))

In [7]: f = lambdify(mus+sigmas, result)

In [8]: f(1,2,3,4,5,10,11,12,13,14)
Out[8]: 120

Or, if you need your current interface

In [9]: numeric_mus = [1,2,3,4,5]

In [10]: numeric_sigmas = [10, 11, 12, 13, 14]

In [11]: f(*(numeric_mus + numeric_sigmas))
Out[11]: 120



On Fri, Aug 30, 2013 at 3:09 PM, Janwillem van Dijk
<jwe.van.d...@gmail.com>wrote:

> T <https://groups.google.com/forum/#!topic/sympy/gRgNYef3oyc>hanks
> Matthew, Is the following snippet of use? Yes and No.
> The lines 5 and 6 are a useful tip; I missed the prod method, that is
> nice. And yes for two N-distributions explicit solutions are to be found in
> the litt and SymPy can find them as it can for longer products and also for
> the uniform distribution which is also of use to me. However, I want both
> the algebraic expression and numerical results. In the past lambdify has
> helped me often and here it works also.
>
> My problem is that when I have PNs as the product of n distributions an mu
> and sigma  symbolic arrays of n means and stdevs then after:
> MeanPns = E(PNs)
> meanPNs = lambdify([mu, sigma], MeanPNs)
> I cannot calculate the mean of the product of two (or more) Ns with
> m=[1.0, 1.0] and s= [0.05, 0.15] by calling
> average = meanPNs(m, s)
> This gives an error saying that meanPNs expects 4 arguments an only 2 are
> given.
> So you need the intermediate step
> ms = m + s
> and than
> average = meanPNs(*ms)
> whereby meanPS gets the 4 Or rather 2n) arguments it wants.
> This works but I do not consider it an elegant solution so I wondered
> whether there is a more elegant solution.
>
> By the way, the purpose of it is to show in a course on uncertainty in
> measurement that the Law of Propagation of Uncertainties (LPU) under
> estimates the standard uncertainty and that the resulting distribution is
> skewed in violation to the common assumption that the Central Limit Theorem
> (CLT) would be valid. Showing this both through equations an numbers.
>
> Thanks again for paying attention, cheers, Janwillem
>
>
> On Friday, 30 August 2013 06:00:21 UTC+2, Matthew wrote:
>
>> Is the following snippet of use?
>>
>> In [1]: from sympy.stats import *
>>
>> In [2]: n = 5
>>
>> In [3]: mus = [Symbol('mu'+str(i), bounded=True) for i in range(n)]
>>
>> In [4]: sigmas = [Symbol('sigma'+str(i), positive=True) for i in range(n)]
>>
>> In [5]: Xs = [Normal('X'+str(i), mu, sigma) for i, (mu, sigma) in
>> enumerate(zip(mus, sigmas))]
>>
>> In [6]: E(prod(Xs))
>> << Big Scary Thing >>
>>
>> In [7]: simplify(E(prod(Xs)))
>> Out[7]: μ₀⋅μ₁⋅μ₂⋅μ₃⋅μ₄
>>
>> Please note that you shouldn't have to switch down to numerics for this
>> problem.  There is a clean analytic form.
>>
>>
>>
>> On Thu, Aug 29, 2013 at 2:01 PM, Janwillem van Dijk 
>> <jwe.va...@gmail.com>wrote:
>>
>>> I have problems lambdifying a symbolic function that needs array
>>> arguments.
>>> The problem I want to solve is to find the statistics of the product of
>>> Normal distributions. Attached is an example that works and even yields the
>>> correct answers. However, I think that the part where the symbolic versions
>>> are lambdified into Python callable functions can't win a beauty contest.
>>> For example a part of the class :
>>>
>>>     self.MeanNN = E(NN)
>>>
>>>     self.meanNN = lambdify([mu, s], self.MeanNN)
>>>
>>>     def meanOfNs(self, mu, s):
>>>
>>>         mus = mu + s
>>>
>>>         return self.meanNN(*mus)
>>>
>>> Than called as:
>>>
>>>     Nn = ProductOfNormals(n)
>>>
>>>     print('Mean: ', Nn.meanOfNs(mu, s))
>>>
>>> Where mu and s are lists of length n
>>>
>>>
>>> In case the arguments are spelled out it looks nicer but I want the
>>> flexibility of variable number of distributions in the product.
>>>
>>> e.g.:
>>>
>>>     self.MeanNN = E(NN)
>>>
>>>     self.meanNN = lambdify([mu1, s1, mu2, s2], self.MeanNN)
>>>
>>> Than:
>>>
>>>     NN = ProductNormalNormal()
>>>
>>>     print('Mean: ', NN.meanNN(mu0, s0, mu1, s1))
>>>
>>> Where all parms are scalar
>>>
>>>
>>> Any tips on how to get a more elegant solution are welcome!!
>>>
>>> The complete example is attached. I am using SymPy 0.7.3 on Python 2.7.4
>>> on Linux.
>>>
>>> Cheers, Janwillem
>>>
>>>
>>>  --
>>> You received this message because you are subscribed to the Google
>>> Groups "sympy" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to sympy+un...@**googlegroups.com.
>>> To post to this group, send email to sy...@googlegroups.com.
>>>
>>> Visit this group at 
>>> http://groups.google.com/**group/sympy<http://groups.google.com/group/sympy>
>>> .
>>> For more options, visit 
>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>> .
>>>
>>
>>  --
> You received this message because you are subscribed to the Google Groups
> "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to sympy+unsubscr...@googlegroups.com.
> To post to this group, send email to sympy@googlegroups.com.
> Visit this group at http://groups.google.com/group/sympy.
> For more options, visit https://groups.google.com/groups/opt_out.
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sympy+unsubscr...@googlegroups.com.
To post to this group, send email to sympy@googlegroups.com.
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to