Author: Brian Kearns <[email protected]>
Branch: numpy-newbyteorder
Changeset: r67879:dd6eb6413320
Date: 2013-11-07 19:17 -0500
http://bitbucket.org/pypy/pypy/changeset/dd6eb6413320/
Log: provide newbyteorder() for numpy dtypes, test
diff --git a/pypy/module/micronumpy/conversion_utils.py
b/pypy/module/micronumpy/conversion_utils.py
--- a/pypy/module/micronumpy/conversion_utils.py
+++ b/pypy/module/micronumpy/conversion_utils.py
@@ -1,6 +1,27 @@
from pypy.interpreter.error import OperationError
from pypy.module.micronumpy.constants import *
+
+def byteorder_converter(space, new_order):
+ endian = new_order[0]
+ if endian not in (NPY_BIG, NPY_LITTLE, NPY_NATIVE, NPY_IGNORE, NPY_SWAP):
+ ch = endian
+ if ch in ('b', 'B'):
+ endian = NPY_BIG
+ elif ch in ('l', 'L'):
+ endian = NPY_LITTLE
+ elif ch in ('n', 'N'):
+ endian = NPY_NATIVE
+ elif ch in ('i', 'I'):
+ endian = NPY_IGNORE
+ elif ch in ('s', 'S'):
+ endian = NPY_SWAP
+ else:
+ raise OperationError(space.w_ValueError, space.wrap(
+ "%s is an unrecognized byteorder" % new_order))
+ return endian
+
+
def clipmode_converter(space, w_mode):
if space.is_none(w_mode):
return NPY_RAISE
@@ -19,6 +40,7 @@
raise OperationError(space.w_TypeError,
space.wrap("clipmode not understood"))
+
def order_converter(space, w_order, default):
if space.is_none(w_order):
return default
diff --git a/pypy/module/micronumpy/interp_dtype.py
b/pypy/module/micronumpy/interp_dtype.py
--- a/pypy/module/micronumpy/interp_dtype.py
+++ b/pypy/module/micronumpy/interp_dtype.py
@@ -9,6 +9,7 @@
from rpython.rlib.rarithmetic import LONG_BIT, r_longlong, r_ulonglong
from rpython.rtyper.lltypesystem import rffi
from rpython.rlib import jit
+from pypy.module.micronumpy.conversion_utils import byteorder_converter
from pypy.module.micronumpy.constants import *
@@ -303,6 +304,17 @@
fields = space.getitem(w_data, space.wrap(4))
self.set_fields(space, fields)
+ @unwrap_spec(new_order=str)
+ def descr_newbyteorder(self, space, new_order=NPY_SWAP):
+ newendian = byteorder_converter(space, new_order)
+ endian = self.byteorder
+ if endian != NPY_IGNORE:
+ if newendian == NPY_SWAP:
+ endian = NPY_OPPBYTE if self.is_native() else NPY_NATBYTE
+ elif newendian != NPY_IGNORE:
+ endian = newendian
+ return W_Dtype(self.itemtype, self.num, self.kind, self.name,
self.char, self.w_box_type, endian)
+
def dtype_from_list(space, w_lst):
lst_w = space.listview(w_lst)
fields = {}
@@ -400,6 +412,7 @@
__reduce__ = interp2app(W_Dtype.descr_reduce),
__setstate__ = interp2app(W_Dtype.descr_setstate),
+ newbyteorder = interp2app(W_Dtype.descr_newbyteorder),
type = interp_attrproperty_w("w_box_type", cls=W_Dtype),
kind = interp_attrproperty("kind", cls=W_Dtype),
diff --git a/pypy/module/micronumpy/test/test_dtypes.py
b/pypy/module/micronumpy/test/test_dtypes.py
--- a/pypy/module/micronumpy/test/test_dtypes.py
+++ b/pypy/module/micronumpy/test/test_dtypes.py
@@ -268,6 +268,42 @@
assert a.dtype.__reduce__() == (dtype, ('i4', 0, 1), (3, '<',
None, None, None, -1, -1, 0))
assert loads(dumps(a.dtype)) == a.dtype
+ def test_newbyteorder(self):
+ import numpypy as np
+ import sys
+ sys_is_le = sys.byteorder == 'little'
+ native_code = sys_is_le and '<' or '>'
+ swapped_code = sys_is_le and '>' or '<'
+ native_dt = np.dtype(native_code+'i2')
+ swapped_dt = np.dtype(swapped_code+'i2')
+ assert native_dt.newbyteorder('S') == swapped_dt
+ assert native_dt.newbyteorder() == swapped_dt
+ assert native_dt == swapped_dt.newbyteorder('S')
+ assert native_dt == swapped_dt.newbyteorder('=')
+ assert native_dt == swapped_dt.newbyteorder('N')
+ assert native_dt == native_dt.newbyteorder('|')
+ assert np.dtype('<i2') == native_dt.newbyteorder('<')
+ assert np.dtype('<i2') == native_dt.newbyteorder('L')
+ assert np.dtype('>i2') == native_dt.newbyteorder('>')
+ assert np.dtype('>i2') == native_dt.newbyteorder('B')
+
+ for t in [np.int_, np.float_]:
+ dt = np.dtype(t)
+ dt1 = dt.newbyteorder().newbyteorder()
+ dt2 = dt.newbyteorder("<")
+ dt3 = dt.newbyteorder(">")
+ assert dt.byteorder != dt1.byteorder
+ #assert hash(dt) == hash(dt1)
+ if dt == dt2:
+ assert dt.byteorder != dt2.byteorder
+ #assert hash(dt) == hash(dt2)
+ else:
+ assert dt.byteorder != dt3.byteorder
+ #assert hash(dt) == hash(dt3)
+
+ exc = raises(ValueError, dt.newbyteorder, 'XX')
+ assert exc.value[0] == 'XX is an unrecognized byteorder'
+
class AppTestTypes(BaseAppTestDtypes):
def test_abstract_types(self):
import numpypy as numpy
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit