[Numpy-svn] r3191 - trunk/numpy/core/src

numpy-svn at scipy.org numpy-svn at scipy.org
Tue Sep 19 18:03:25 CDT 2006


Author: oliphant
Date: 2006-09-19 18:03:14 -0500 (Tue, 19 Sep 2006)
New Revision: 3191

Modified:
   trunk/numpy/core/src/arraymethods.c
Log:
Fix mean, std, and var methods so that they reduce over double data-type with integer inputs.

Modified: trunk/numpy/core/src/arraymethods.c
===================================================================
--- trunk/numpy/core/src/arraymethods.c	2006-09-19 17:29:34 UTC (rev 3190)
+++ trunk/numpy/core/src/arraymethods.c	2006-09-19 23:03:14 UTC (rev 3191)
@@ -1353,6 +1353,27 @@
 	return ret;
 }
 
+/* Return typenumber from dtype2 unless it is NULL, then return 
+   NPY_DOUBLE if dtype1->type_num is integer or bool
+   and dtype1->type_num otherwise. 
+*/
+static int
+_get_type_num_double(PyArray_Descr *dtype1, PyArray_Descr *dtype2)
+{
+        if (dtype2 == NULL) { /* Use floating point reduction 
+                                 on integer data-types */
+                if (dtype1->type_num < NPY_FLOAT) {
+                        return NPY_DOUBLE;
+                }
+                else {
+                        return dtype1->type_num;
+                }
+        }
+        else {
+                return dtype2->type_num;
+        }
+}
+
 #define _CHKTYPENUM(typ) ((typ) ? (typ)->type_num : PyArray_NOTYPE)
 
 static PyObject *
@@ -1361,6 +1382,7 @@
 	int axis=MAX_DIMS;
 	PyArray_Descr *dtype=NULL;
         PyArrayObject *out=NULL;
+        int num;
 	static char *kwlist[] = {"axis", "dtype", "out", NULL};
 
 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O&O&O&", kwlist,
@@ -1368,9 +1390,10 @@
 					 &axis, PyArray_DescrConverter2,
 					 &dtype,
                                          PyArray_OutputConverter,
-                                         &out)) return NULL;
+                                         &out)) return NULL;        
 
-	return PyArray_Mean(self, axis, _CHKTYPENUM(dtype), out);
+        num = _get_type_num_double(self->descr, dtype);
+	return PyArray_Mean(self, axis, num, out);
 }
 
 static PyObject *
@@ -1489,6 +1512,7 @@
 	int axis=MAX_DIMS;
 	PyArray_Descr *dtype=NULL;
         PyArrayObject *out=NULL;
+        int num;
 	static char *kwlist[] = {"axis", "dtype", "out", NULL};
 
 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O&O&O&", kwlist,
@@ -1498,7 +1522,8 @@
                                          PyArray_OutputConverter,
                                          &out)) return NULL;
 
-	return PyArray_Std(self, axis, _CHKTYPENUM(dtype), out, 0);
+        num = _get_type_num_double(self->descr, dtype);
+        return PyArray_Std(self, axis, num, out, 0);
 }
 
 
@@ -1508,6 +1533,7 @@
 	int axis=MAX_DIMS;
 	PyArray_Descr *dtype=NULL;
         PyArrayObject *out=NULL;
+        int num;
 	static char *kwlist[] = {"axis", "dtype", "out", NULL};
 
 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O&O&O&", kwlist,
@@ -1517,7 +1543,8 @@
                                          PyArray_OutputConverter,
                                          &out)) return NULL;
 
-	return PyArray_Std(self, axis, _CHKTYPENUM(dtype), out, 1);
+        num = _get_type_num_double(self->descr, dtype);
+	return PyArray_Std(self, axis, num, out, 1);
 }
 
 



More information about the Numpy-svn mailing list