[Scipy-svn] r7032 - trunk/scipy/stats

scipy-svn at scipy.org scipy-svn at scipy.org
Fri Jan 14 20:23:56 EST 2011


Author: josef
Date: 2011-01-14 19:23:55 -0600 (Fri, 14 Jan 2011)
New Revision: 7032

Modified:
   trunk/scipy/stats/distributions.py
Log:
stats.distributions, correction so that stats and moment method don't break with empty goodargs, see ticket:934 and ticket:1291

Modified: trunk/scipy/stats/distributions.py
===================================================================
--- trunk/scipy/stats/distributions.py	2011-01-14 22:03:16 UTC (rev 7031)
+++ trunk/scipy/stats/distributions.py	2011-01-15 01:23:55 UTC (rev 7032)
@@ -1470,59 +1470,65 @@
         output = []
 
         # Use only entries that are valid in calculation
-        goodargs = argsreduce(cond, *(args+(scale,loc)))
-        scale, loc, goodargs = goodargs[-2], goodargs[-1], goodargs[:-2]
-        if 'm' in moments:
-            if mu is None:
-                mu = self._munp(1.0,*goodargs)
-            out0 = default.copy()
-            place(out0,cond,mu*scale+loc)
-            output.append(out0)
-
-        if 'v' in moments:
-            if mu2 is None:
-                mu2p = self._munp(2.0,*goodargs)
+        if any(cond):
+            goodargs = argsreduce(cond, *(args+(scale,loc)))
+            scale, loc, goodargs = goodargs[-2], goodargs[-1], goodargs[:-2]
+            if 'm' in moments:
                 if mu is None:
                     mu = self._munp(1.0,*goodargs)
-                mu2 = mu2p - mu*mu
-            if np.isinf(mu):
-                #if mean is inf then var is also inf
-                mu2 = np.inf
-            out0 = default.copy()
-            place(out0,cond,mu2*scale*scale)
-            output.append(out0)
+                out0 = default.copy()
+                place(out0,cond,mu*scale+loc)
+                output.append(out0)
 
-        if 's' in moments:
-            if g1 is None:
-                mu3p = self._munp(3.0,*goodargs)
-                if mu is None:
-                    mu = self._munp(1.0,*goodargs)
+            if 'v' in moments:
                 if mu2 is None:
                     mu2p = self._munp(2.0,*goodargs)
+                    if mu is None:
+                        mu = self._munp(1.0,*goodargs)
                     mu2 = mu2p - mu*mu
-                mu3 = mu3p - 3*mu*mu2 - mu**3
-                g1 = mu3 / mu2**1.5
-            out0 = default.copy()
-            place(out0,cond,g1)
-            output.append(out0)
+                if np.isinf(mu):
+                    #if mean is inf then var is also inf
+                    mu2 = np.inf
+                out0 = default.copy()
+                place(out0,cond,mu2*scale*scale)
+                output.append(out0)
 
-        if 'k' in moments:
-            if g2 is None:
-                mu4p = self._munp(4.0,*goodargs)
-                if mu is None:
-                    mu = self._munp(1.0,*goodargs)
-                if mu2 is None:
-                    mu2p = self._munp(2.0,*goodargs)
-                    mu2 = mu2p - mu*mu
-                if mu3 is None:
+            if 's' in moments:
+                if g1 is None:
                     mu3p = self._munp(3.0,*goodargs)
+                    if mu is None:
+                        mu = self._munp(1.0,*goodargs)
+                    if mu2 is None:
+                        mu2p = self._munp(2.0,*goodargs)
+                        mu2 = mu2p - mu*mu
                     mu3 = mu3p - 3*mu*mu2 - mu**3
-                mu4 = mu4p - 4*mu*mu3 - 6*mu*mu*mu2 - mu**4
-                g2 = mu4 / mu2**2.0 - 3.0
-            out0 = default.copy()
-            place(out0,cond,g2)
-            output.append(out0)
+                    g1 = mu3 / mu2**1.5
+                out0 = default.copy()
+                place(out0,cond,g1)
+                output.append(out0)
 
+            if 'k' in moments:
+                if g2 is None:
+                    mu4p = self._munp(4.0,*goodargs)
+                    if mu is None:
+                        mu = self._munp(1.0,*goodargs)
+                    if mu2 is None:
+                        mu2p = self._munp(2.0,*goodargs)
+                        mu2 = mu2p - mu*mu
+                    if mu3 is None:
+                        mu3p = self._munp(3.0,*goodargs)
+                        mu3 = mu3p - 3*mu*mu2 - mu**3
+                    mu4 = mu4p - 4*mu*mu3 - 6*mu*mu*mu2 - mu**4
+                    g2 = mu4 / mu2**2.0 - 3.0
+                out0 = default.copy()
+                place(out0,cond,g2)
+                output.append(out0)
+        else: #no valid args
+            output = []
+            for _ in moments:
+                out0 = default.copy()
+                output.append(out0)
+
         if len(output) == 1:
             return output[0]
         else:
@@ -1542,6 +1548,8 @@
             instance object for more information)
 
         """
+        if not self._argcheck(*args):
+            return nan
         if (floor(n) != n):
             raise ValueError("Moment must be an integer.")
         if (n < 0): raise ValueError("Moment must be positive.")




More information about the Scipy-svn mailing list