[SciPy-User] scipy.stats pmf evaluation
nicky van foreest
vanforeest at gmail.com
Wed May 18 06:34:36 EDT 2011
Hi Josef,
Thanks for the explanations.
Nicky
On 16 May 2011 13:22, <josef.pktd at gmail.com> wrote:
> On Mon, May 16, 2011 at 7:02 AM, nicky van foreest <vanforeest at gmail.com> wrote:
>> Hi Josef,
>>
>> This works indeed. But I must admit that I don't understand why. Can
>> you give a hint where in the docs I might find an explanation?
>
> I don't think it's in the docs anywhere, just the docs on broadcasting
>
> (almost) all the _pdf, _cdf, ... methods are elementwise operations
> that are fully vectorized. Some generic methods, for example
> integration in cdf, are vectorized through an explicit call to
> numpy.vectorize.
> This means that standard numpy broadcasting works for all arguments
> for the distribution methods (with a few exceptions)
>
>
>>>> 10 * np.arange(2)[:,None] + np.arange(3)[None, :]
> array([[ 0, 1, 2],
> [10, 11, 12]])
>
>>>> np.add(10 * np.arange(2)[:,None], np.arange(3)[None, :])
> array([[ 0, 1, 2],
> [10, 11, 12]])
>
>>>> np.add(10 * np.arange(2), np.arange(3))
> Traceback (most recent call last):
> File "<pyshell#4>", line 1, in <module>
> np.add(10 * np.arange(2), np.arange(3))
> ValueError: shape mismatch: objects cannot be broadcast to a single shape
>>>>
>
> hope that helps,
>
> Josef
>
>>
>> thanks
>>
>> Nicky
>>
>> On 15 May 2011 20:00, nicky van foreest <vanforeest at gmail.com> wrote:
>>> Hi Josef,
>>>
>>> Thanks.
>>>
>>> On 15 May 2011 00:10, <josef.pktd at gmail.com> wrote:
>>>> On Sat, May 14, 2011 at 5:35 PM, nicky van foreest <vanforeest at gmail.com> wrote:
>>>>> On 14 May 2011 22:10, <josef.pktd at gmail.com> wrote:
>>>>>> On Sat, May 14, 2011 at 4:06 PM, nicky van foreest <vanforeest at gmail.com> wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> I wanted to compute a probability mass function on a range and a grid
>>>>>>> at the same time, but this fails. Here is an example.
>>>>>>>
>>>>>>> In [1]: from scipy.stats import poisson
>>>>>>>
>>>>>>> In [2]: import numpy as np
>>>>>>>
>>>>>>> In [3]: print poisson.pmf(1, 1)
>>>>>>> 0.367879441171
>>>>>>>
>>>>>>> In [4]: grid = np.arange(np.finfo(float).eps,1.1,0.1)
>>>>>>>
>>>>>>> In [5]: print poisson.pmf(1, grid)
>>>>>>> [ 2.22044605e-16 9.04837418e-02 1.63746151e-01 2.22245466e-01
>>>>>>> 2.68128018e-01 3.03265330e-01 3.29286982e-01 3.47609713e-01
>>>>>>> 3.59463171e-01 3.65912694e-01 3.67879441e-01]
>>>>>>>
>>>>>>> In [6]: print poisson.pmf(range(2), 1)
>>>>>>> [ 0.36787944 0.36787944]
>>>>>>>
>>>>>>>
>>>>>>> +++
>>>>>>>
>>>>>>> Up to now everything works as expected. But this fails:
>>>>>>>
>>>>>>> +++
>>>>>>>
>>>>>>> In [7]: print poisson.pmf(range(2), grid)
>>>>>>>
>>>>>>> ValueError: shape mismatch: objects cannot be broadcast to a single shape
>>>>>>>
>>>>>>> +++
>>>>>>>
>>>>>>> Why is the call to poisson.pmf(range(2), grid) wrong, while it works
>>>>>>> on either a range or a grid?
>>>>>>>
>>>>>>> Does anybody perhaps know the right way to compute
>>>>>>> poisson.pmf(range(2), grid)" without using a for loop?
>>>>>>
>>>>>> You are not broadcasting, (range(2), grid) need to broadcast against
>>>>>> each other. If it doesn't work then, then it's a bug.
>>>>>
>>>>> Thanks Josef. But how do I do this? The range will, usually, not
>>>>> contain the same number of elements as the grid. What I would like to
>>>>> compute is something like this:
>>>>>
>>>>> for j in range(3):
>>>>> for x in grid:
>>>>> poisson.pmf(j, x)
>>>>>
>>>>> By the above example I can use two types of shortcuts::
>>>>>
>>>>> for j in range(3):
>>>>> poisson.pmf(j, grid)
>>>>>
>>>>> or
>>>>>
>>>>> for x in grid:
>>>>> poisson.pmf(range(3), x)
>>>>>
>>>>>
>>>>> but the pmf function does not support broadcasting on both directions
>>>>> at the same time, or (more probable) it can be done, but I make a
>>>>> mistake somewhere.
>>>>
>>>> add a newaxis to one of the two
>>>>
>>>>>>> from scipy import stats
>>>>>>> grid = np.arange(np.finfo(float).eps,1.1,0.1)
>>>>
>>>>>>> print stats.poisson.pmf(np.arange(2)[:,None], grid)
>>>> [[ 1.00000000e+00 9.04837418e-01 8.18730753e-01 7.40818221e-01
>>>> 6.70320046e-01 6.06530660e-01 5.48811636e-01 4.96585304e-01
>>>> 4.49328964e-01 4.06569660e-01 3.67879441e-01]
>>>> [ 2.22044605e-16 9.04837418e-02 1.63746151e-01 2.22245466e-01
>>>> 2.68128018e-01 3.03265330e-01 3.29286982e-01 3.47609713e-01
>>>> 3.59463171e-01 3.65912694e-01 3.67879441e-01]]
>>>>
>>>>>>> print stats.poisson.pmf(np.arange(2), grid[:,None])
>>>> [[ 1.00000000e+00 2.22044605e-16]
>>>> [ 9.04837418e-01 9.04837418e-02]
>>>> [ 8.18730753e-01 1.63746151e-01]
>>>> [ 7.40818221e-01 2.22245466e-01]
>>>> [ 6.70320046e-01 2.68128018e-01]
>>>> [ 6.06530660e-01 3.03265330e-01]
>>>> [ 5.48811636e-01 3.29286982e-01]
>>>> [ 4.96585304e-01 3.47609713e-01]
>>>> [ 4.49328964e-01 3.59463171e-01]
>>>> [ 4.06569660e-01 3.65912694e-01]
>>>> [ 3.67879441e-01 3.67879441e-01]]
>>>>
>>>> 3-dim
>>>>
>>>>>>> print stats.poisson.pmf(np.arange(6).reshape((1,2,3)), grid[:,None,None])
>>>>
>>>>
>>>> There is a known bug, when the support depends on one of the
>>>> parameters of the distribution, but it should work for most cases.
>>>>
>>>> Josef
>>>>
>>>>
>>>>>
>>>>> Nicky
>>>>>>
>>>>>> Josef
>>>>>>
>>>>>>>
>>>>>>> thanks
>>>>>>>
>>>>>>> Nicky
>>>>>>> _______________________________________________
>>>>>>> SciPy-User mailing list
>>>>>>> SciPy-User at scipy.org
>>>>>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>>>>>
>>>>>> _______________________________________________
>>>>>> SciPy-User mailing list
>>>>>> SciPy-User at scipy.org
>>>>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>>>>
>>>>> _______________________________________________
>>>>> SciPy-User mailing list
>>>>> SciPy-User at scipy.org
>>>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>>>
>>>> _______________________________________________
>>>> SciPy-User mailing list
>>>> SciPy-User at scipy.org
>>>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>>>
>>>
>> _______________________________________________
>> SciPy-User mailing list
>> SciPy-User at scipy.org
>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>
More information about the SciPy-User
mailing list