[Scipy-svn] r6945 - in trunk/scipy/spatial: . tests
scipy-svn at scipy.org
scipy-svn at scipy.org
Fri Nov 26 19:31:04 EST 2010
Author: warren.weckesser
Date: 2010-11-26 18:31:04 -0600 (Fri, 26 Nov 2010)
New Revision: 6945
Modified:
trunk/scipy/spatial/distance.py
trunk/scipy/spatial/tests/test_distance.py
Log:
BUG: spatial: Raise a ValueError in sokalsneath if both vectors are entirely false (ticket #876). Also fixed the double appearance of the factor 2 in the docstrings for sokalsneath and sokalmichener.
Modified: trunk/scipy/spatial/distance.py
===================================================================
--- trunk/scipy/spatial/distance.py 2010-11-26 23:41:53 UTC (rev 6944)
+++ trunk/scipy/spatial/distance.py 2010-11-27 00:31:04 UTC (rev 6945)
@@ -739,8 +739,8 @@
.. math::
- \frac{2R}
- {S + 2R}
+ \frac{R}
+ {S + R}
where :math:`c_{ij}` is the number of occurrences of
:math:`\mathtt{u[k]} = i` and :math:`\mathtt{v[k]} = j` for
@@ -775,8 +775,8 @@
.. math::
- \frac{2R}
- {c_{TT} + 2R}
+ \frac{R}
+ {c_{TT} + R}
where :math:`c_{ij}` is the number of occurrences of
:math:`\mathtt{u[k]} = i` and :math:`\mathtt{v[k]} = j` for
@@ -799,7 +799,11 @@
else:
ntt = (u * v).sum()
(nft, ntf) = _nbool_correspond_ft_tf(u, v)
- return float(2.0 * (ntf + nft))/float(ntt + 2.0 * (ntf + nft))
+ denom = ntt + 2.0 * (ntf + nft)
+ if denom == 0:
+ raise ValueError('Sokal-Sneath dissimilarity is not defined for '
+ 'vectors that are entirely false.')
+ return float(2.0 * (ntf + nft)) / denom
def pdist(X, metric='euclidean', p=2, V=None, VI=None):
Modified: trunk/scipy/spatial/tests/test_distance.py
===================================================================
--- trunk/scipy/spatial/tests/test_distance.py 2010-11-26 23:41:53 UTC (rev 6944)
+++ trunk/scipy/spatial/tests/test_distance.py 2010-11-27 00:31:04 UTC (rev 6945)
@@ -37,7 +37,8 @@
import os.path
import numpy as np
-from numpy.testing import verbose, TestCase, run_module_suite
+from numpy.testing import verbose, TestCase, run_module_suite, \
+ assert_raises
from scipy.spatial.distance import squareform, pdist, cdist, matching, \
jaccard, dice, sokalsneath, rogerstanimoto, \
russellrao, yule, num_obs_y, num_obs_dm, \
@@ -1700,5 +1701,11 @@
y = np.random.rand(n*(n-1)/2)
return y
+
+def test_sokalsneath_all_false():
+ """Regression test for ticket #876"""
+ assert_raises(ValueError, sokalsneath, [False, False, False], [False, False, False])
+
+
if __name__=="__main__":
run_module_suite()
More information about the Scipy-svn
mailing list