<br><br><div><span class="gmail_quote">On 7/7/07, <b class="gmail_sendername">Travis Oliphant</b> <<a href="mailto:oliphant.travis@ieee.org">oliphant.travis@ieee.org</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>><br>><br>> On 7/6/07, *Travis Oliphant* <<a href="mailto:oliphant.travis@ieee.org">oliphant.travis@ieee.org</a><br>> <mailto:<a href="mailto:oliphant.travis@ieee.org">oliphant.travis@ieee.org</a>>> wrote:
<br>><br>>     Timothy Hochberg wrote:<br>>     ><br>>     > I'm working on getting some old code working with numpy and I<br>>     noticed<br>>     > that bool_ is not a subclass of int. Given that python's bool
<br>>     > subclasses into and that the other scalar types are subclasses of<br>>     > their respective counterparts it seems at first glance that<br>>     > numpy.bool_ should subclass python's bool, which in turn subclasses
<br>>     > int. Or am I missing something here?<br>>     The reason it is not, is because it is not binary compatible with<br>>     Python's integer.   The numpy bool_ is always only 8-bits while the<br>>     Python integer is 32-bits or 64-bits.
<br>><br>>     This could be changed I suspect, but then it would break the<br>>     relationship between scalars and their array counterparts<br>><br>><br>> Do you have and idea off the top of your head head how painful this
<br>> would be from an implementation standpoint. And is there a theoretical<br>> reason that it is important that the scalar and array implementations<br>> match? I would think that, conceptually, they are all 1-bit integers,
<br>> and it seems that the 8-bit, versus 32- or 64-bits is just an<br>> implementation detail.<br>It would probably take about 2-3 hours to make the change and about 3<br>more hours to fix the problems that were not anticipated.    Basically,
<br>we would have to special-case the bool like we do the unicode scalar<br>(which also doesn't necessarily match the array-based representation but<br>instead follows the Python implementation).<br><br>I guess I don't really see a problem in switching just the 
numpy.bool_<br>scalar to be a sub-class of the Python bool type and adjusting the code<br>to make the switch when creating a scalar.</blockquote><div><br>I gave this a try. Since so much code is auto-generated, it can be difficult to figure out what's going on in the core matrix stuff. Still, it seems like the solution is almost absurdly easy, consisting of changing only three lines. First off, does this seem right? Code compiled against this patch passes all tests and seems to run my application right, but that's not conclusive. 
<br><br>Please let me know if I missed something obvious.  <br><br></div></div>-- <br>.  __<br>.   |-\<br>.<br>.  <a href="mailto:tim.hochberg@ieee.org">tim.hochberg@ieee.org</a><br><br>===================================================================
<br><br>Index: numpy/core/code_generators/generate_array_api.py<br>===================================================================<br>--- numpy/core/code_generators/generate_array_api.py    (revision 3883)<br>+++ numpy/core/code_generators/generate_array_api.py    (working copy)
<br>@@ -17,7 +17,7 @@<br> <br> typedef struct {<br>         PyObject_HEAD<br>-        npy_bool obval;<br>+        npy_long obval;<br> } PyBoolScalarObject;<br> <br> <br>Index: numpy/core/include/numpy/arrayscalars.h<br>===================================================================
<br>--- numpy/core/include/numpy/arrayscalars.h    (revision 3883)<br>+++ numpy/core/include/numpy/arrayscalars.h    (working copy)<br>@@ -1,7 +1,7 @@<br> #ifndef _MULTIARRAYMODULE<br> typedef struct {<br>     PyObject_HEAD
<br>-    npy_bool obval;<br>+    npy_long obval;<br> } PyBoolScalarObject;<br> #endif<br> <br>Index: numpy/core/src/multiarraymodule.c<br>===================================================================<br>--- numpy/core/src/multiarraymodule.c    (revision 3883)
<br>+++ numpy/core/src/multiarraymodule.c    (working copy)<br>@@ -7417,7 +7417,7 @@<br>                 return -1;                                              \<br>         }<br> <br>-        SINGLE_INHERIT(Bool, Generic);
<br>+        DUAL_INHERIT(Bool, Bool, Generic);<br>         SINGLE_INHERIT(Byte, SignedInteger);<br>         SINGLE_INHERIT(Short, SignedInteger);<br> #if SIZEOF_INT == SIZEOF_LONG<br><br><br>