Author: Timo Paulssen <timona...@perpetuum-immobile.de> Branch: numpy-data-buffer Changeset: r47780:f4a7400e9c6e Date: 2011-10-03 07:22 +0200 http://bitbucket.org/pypy/pypy/changeset/f4a7400e9c6e/
Log: move numpy.fromstring to applevel, add support for dtypes and count. diff --git a/lib_pypy/numpy/__init__.py b/lib_pypy/numpy/__init__.py --- a/lib_pypy/numpy/__init__.py +++ b/lib_pypy/numpy/__init__.py @@ -6,7 +6,6 @@ zeros, empty, ones, - fromstring, abs, absolute, @@ -87,3 +86,24 @@ return array(result) +def fromstring(s, dtype=float, count=-1, sep=''): + from _numpy import dtype as dt + if sep: + raise NotImplementedError("Cannot use fromstring with a separator yet") + + _dtype = dt(dtype) + if count > 0: + length = count * _dtype.itemsize + if length > len(s): + raise ValueError("length of string (%d) not enough for %d %s" % (len(s), count, _dtype)) + s = s[:length] + else: + length = len(s) + if len(s) % _dtype.itemsize != 0: + raise ValueError("length of string (%d) not evenly dividable by size of dtype (%d)" % (len(s), _dtype.itemsize)) + + arr = empty(length / _dtype.itemsize, dtype=_dtype) + print len(arr.data), len(s), length, _dtype.itemsize + arr.data[:length] = s + + return arr diff --git a/lib_pypy/pypy_test/test_numpy.py b/lib_pypy/pypy_test/test_numpy.py --- a/lib_pypy/pypy_test/test_numpy.py +++ b/lib_pypy/pypy_test/test_numpy.py @@ -74,3 +74,25 @@ raises(ValueError, "bincount(c, w)") raises(ValueError, "bincount([])") + def test_fromstring(self): + from numpy import fromstring + import struct + + data = struct.pack('dddd', 0, 1, 2, 3) + a = fromstring(data) + assert len(a) == 4 + for i in range(4): + assert a[i] == i + raises(ValueError, fromstring, "abc") + + data = struct.pack("iiii", 0, 1, 2, 3) + assert len(a) == 4 + a = fromstring(data, dtype="i") + for i in range(4): + assert a[i] == i + + data = struct.pack("iiii", 0, 1, 2, 3) + "hello world" + a = fromstring(data, dtype="i", count=4) + assert len(a) == 4 + for i in range(4): + assert a[i] == i diff --git a/pypy/module/_numpy/__init__.py b/pypy/module/_numpy/__init__.py --- a/pypy/module/_numpy/__init__.py +++ b/pypy/module/_numpy/__init__.py @@ -12,7 +12,6 @@ 'zeros': 'interp_numarray.zeros', 'empty': 'interp_numarray.zeros', 'ones': 'interp_numarray.ones', - 'fromstring': 'interp_support.fromstring', } # ufuncs diff --git a/pypy/module/_numpy/interp_support.py b/pypy/module/_numpy/interp_support.py deleted file mode 100644 --- a/pypy/module/_numpy/interp_support.py +++ /dev/null @@ -1,34 +0,0 @@ -from pypy.interpreter.error import OperationError -from pypy.interpreter.gateway import unwrap_spec -from pypy.module._numpy.interp_dtype import W_Float64Dtype -from pypy.rlib.rstruct.runpack import runpack -from pypy.rpython.lltypesystem import lltype, rffi - - -FLOAT_SIZE = rffi.sizeof(lltype.Float) - -@unwrap_spec(s=str) -def fromstring(space, s): - from pypy.module._numpy.interp_numarray import SingleDimArray - length = len(s) - - if length % FLOAT_SIZE == 0: - number = length/FLOAT_SIZE - else: - raise OperationError(space.w_ValueError, space.wrap( - "string length %d not divisable by %d" % (length, FLOAT_SIZE))) - - dtype = space.fromcache(W_Float64Dtype) - a = SingleDimArray(number, dtype=dtype) - - start = 0 - end = FLOAT_SIZE - i = 0 - while i < number: - part = s[start:end] - a.dtype.setitem(a.storage, i, dtype.box(runpack('d', part))) - i += 1 - start += FLOAT_SIZE - end += FLOAT_SIZE - - return space.wrap(a) diff --git a/pypy/module/_numpy/test/test_numarray.py b/pypy/module/_numpy/test/test_numarray.py --- a/pypy/module/_numpy/test/test_numarray.py +++ b/pypy/module/_numpy/test/test_numarray.py @@ -587,15 +587,3 @@ assert c[i] == func(b[i], 3) -class AppTestSupport(object): - def setup_class(cls): - import struct - cls.space = gettestobjspace(usemodules=('_numpy',)) - cls.w_data = cls.space.wrap(struct.pack('dddd', 1, 2, 3, 4)) - - def test_fromstring(self): - from _numpy import fromstring - a = fromstring(self.data) - for i in range(4): - assert a[i] == i + 1 - raises(ValueError, fromstring, "abc") _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit