[Scipy-svn] r4172 - in trunk/scipy/cluster: . tests

scipy-svn at scipy.org scipy-svn at scipy.org
Thu Apr 24 17:41:31 EDT 2008


Author: cookedm
Date: 2008-04-24 16:41:27 -0500 (Thu, 24 Apr 2008)
New Revision: 4172

Modified:
   trunk/scipy/cluster/hierarchy.py
   trunk/scipy/cluster/tests/test_hierarchy.py
Log:
scipy.cluster: float96 is not guaranteed to exist.
* If you're testing if a an array, if floating-point, is of doubles, check the dtype against floating and double.
* Use longdouble instead of float96 in the tests
* Fix some other dtype uses


Modified: trunk/scipy/cluster/hierarchy.py
===================================================================
--- trunk/scipy/cluster/hierarchy.py	2008-04-24 05:03:09 UTC (rev 4171)
+++ trunk/scipy/cluster/hierarchy.py	2008-04-24 21:41:27 UTC (rev 4172)
@@ -208,8 +208,8 @@
     """
     if a.base is not None:
         return a.copy()
-    elif (a.dtype == np.float32):
-        return np.float64(a)
+    elif np.issubsctype(a, np.float32):
+        return array(a, dtype=np.double)
     else:
         return a
 
@@ -450,11 +450,10 @@
            same minimum distance. This implementation may chose a
            different minimum than the MATLAB(TM) version.
         """
-    if type(method) != types.StringType:
+    if not isinstance(method, str):
         raise TypeError("Argument 'method' must be a string.")
 
-    if type(y) != _array_type:
-        raise TypeError("Argument 'y' must be a numpy array.")
+    y = np.asarray(y)
 
     s = y.shape
     if len(s) == 1:
@@ -723,10 +722,9 @@
     transformation.
     """
 
-    if type(X) is not _array_type:
-        raise TypeError('The parameter passed must be an array.')
+    X = np.asarray(X)
 
-    if X.dtype != np.double:
+    if not np.issubsctype(X, np.double):
         raise TypeError('A double array must be passed.')
 
     s = X.shape
@@ -744,7 +742,7 @@
             raise ValueError('Incompatible vector size. It must be a binomial coefficient n choose 2 for some integer n >= 2.')
 
         # Allocate memory for the distance matrix.
-        M = np.zeros((d, d), 'double')
+        M = np.zeros((d, d), dtype=np.double)
 
         # Since the C code does not support striding using strides.
         # The dimensions are used instead.
@@ -771,7 +769,7 @@
         d = s[0]
 
         # Create a vector.
-        v = np.zeros(((d * (d - 1) / 2),), 'double')
+        v = np.zeros(((d * (d - 1) / 2),), dtype=np.double)
 
         # Since the C code does not support striding using strides.
         # The dimensions are used instead.
@@ -881,7 +879,9 @@
 
       for k < n.
     """
-    return np.double(scipy.bitwise_and((u != v), scipy.bitwise_or(u != 0, v != 0)).sum()) / np.double(scipy.bitwise_or(u != 0, v != 0).sum())
+    return (np.double(np.bitwise_and((u != v),
+                     np.bitwise_or(u != 0, v != 0)).sum()) 
+            /  np.double(np.bitwise_or(u != 0, v != 0).sum()))
 
 def kulsinski(u, v):
     """
@@ -912,8 +912,9 @@
       n-vectors u and v. V is a m-dimensional vector of component
       variances. It is usually computed among a larger collection vectors.
     """
-    if type(V) is not _array_type or len(V.shape) != 1 or V.shape[0] != u.shape[0] or u.shape[0] != v.shape[0]:
-        raise TypeError('V must be a 1-D numpy array of doubles of the same dimension as u and v.')
+    V = np.asarray(V)
+    if len(V.shape) != 1 or V.shape[0] != u.shape[0] or u.shape[0] != v.shape[0]:
+        raise TypeError('V must be a 1-D array of the same dimension as u and v.')
     return np.sqrt(((u-v)**2 / V).sum())
 
 def cityblock(u, v):
@@ -933,9 +934,8 @@
         (u-v)VI(u-v)^T
       where VI is the inverse covariance matrix.
     """
-    if type(V) is not _array_type:
-        raise TypeError('V must be a 1-D numpy array of doubles of the same dimension as u and v.')
-    return np.sqrt(scipy.dot(scipy.dot((u-v),VI),(u-v).T).sum())
+    V = np.asarray(V)
+    return np.sqrt(np.dot(np.dot((u-v),VI),(u-v).T).sum())
 
 def chebyshev(u, v):
     """
@@ -1301,11 +1301,11 @@
 #           verifiable, but less efficient implementation.
 
 
-    if type(X) is not _array_type:
-        raise TypeError('The parameter passed must be an array.')
+    X = np.asarray(X)
 
-    if X.dtype == np.float32 or X.dtype == np.float96:
-        raise TypeError('Floating point arrays must be 64-bit.')
+    if np.issubsctype(X, np.floating) and not np.issubsctype(X, np.double):
+        raise TypeError('Floating point arrays must be 64-bit (got %r).' %
+        (X.dtype.type,))
 
     # The C code doesn't do striding.
     [X] = _copy_arrays_if_base_present([X])
@@ -1380,7 +1380,7 @@
             if V is not None:
                 if type(V) is not _array_type:
                     raise TypeError('Variance vector V must be a numpy array')
-                if V.dtype != np.float64:
+                if V.dtype != np.double:
                     raise TypeError('Variance vector V must contain doubles.')
                 if len(V.shape) != 1:
                     raise ValueError('Variance vector V must be one-dimensional.')
@@ -1417,7 +1417,7 @@
             if VI is not None:
                 if type(VI) != _array_type:
                     raise TypeError('VI must be a numpy array.')
-                if VI.dtype != np.float64:
+                if VI.dtype != np.double:
                     raise TypeError('The array must contain 64-bit floats.')
                 [VI] = _copy_arrays_if_base_present([VI])
             else:

Modified: trunk/scipy/cluster/tests/test_hierarchy.py
===================================================================
--- trunk/scipy/cluster/tests/test_hierarchy.py	2008-04-24 05:03:09 UTC (rev 4171)
+++ trunk/scipy/cluster/tests/test_hierarchy.py	2008-04-24 21:41:27 UTC (rev 4172)
@@ -99,15 +99,15 @@
         except:
             self.fail("float32 observation matrices should generate an error in pdist.")
 
-    def test_pdist_raises_type_error_float96(self):
-        "Testing whether passing a float96 observation array generates an exception."
-        X = numpy.zeros((10, 10), dtype=numpy.float96)
+    def test_pdist_raises_type_error_longdouble(self):
+        "Testing whether passing a longdouble observation array generates an exception."
+        X = numpy.zeros((10, 10), dtype=numpy.longdouble)
         try:
             pdist(X, 'euclidean')
         except TypeError:
             pass
         except:
-            self.fail("float96 observation matrices should generate an error in pdist.")
+            self.fail("longdouble observation matrices should generate an error in pdist.")
 
     def test_pdist_var_raises_type_error_float32(self):
         "Testing whether passing a float32 variance matrix generates an exception."
@@ -120,17 +120,17 @@
         except:
             self.fail("float32 V matrices should generate an error in pdist('seuclidean').")
 
-    def test_pdist_var_raises_type_error_float96(self):
-        "Testing whether passing a float96 variance matrix generates an exception."
+    def test_pdist_var_raises_type_error_longdouble(self):
+        "Testing whether passing a longdouble variance matrix generates an exception."
         X = numpy.zeros((10, 10))
-        V = numpy.zeros((10, 10), dtype=numpy.float96)
+        V = numpy.zeros((10, 10), dtype=numpy.longdouble)
 
         try:
             pdist(X, 'seuclidean', V=V)
         except TypeError:
             pass
         except:
-            self.fail("float96 matrices should generate an error in pdist('seuclidean').")
+            self.fail("longdouble matrices should generate an error in pdist('seuclidean').")
 
     def test_pdist_ivar_raises_type_error_float32(self):
         "Testing whether passing a float32 variance matrix generates an exception."
@@ -143,17 +143,17 @@
         except:
             self.fail("float32 matrices should generate an error in pdist('mahalanobis').")
 
-    def test_pdist_ivar_raises_type_error_float96(self):
-        "Testing whether passing a float96 variance matrix generates an exception."
+    def test_pdist_ivar_raises_type_error_longdouble(self):
+        "Testing whether passing a longdouble variance matrix generates an exception."
         X = numpy.zeros((10, 10))
-        VI = numpy.zeros((10, 10), dtype=numpy.float96)
+        VI = numpy.zeros((10, 10), dtype=numpy.longdouble)
 
         try:
             pdist(X, 'mahalanobis', VI=VI)
         except TypeError:
             pass
         except:
-            self.fail("float96 matrices should generate an error in pdist('mahalanobis').")
+            self.fail("longdouble matrices should generate an error in pdist('mahalanobis').")
 
     ################### pdist: euclidean
     def test_pdist_euclidean_random(self):




More information about the Scipy-svn mailing list