Author: Alex Gaynor <alex.gay...@gmail.com> Branch: Changeset: r61645:18b9462c447b Date: 2013-02-22 23:29 -0800 http://bitbucket.org/pypy/pypy/changeset/18b9462c447b/
Log: merged upstream diff --git a/lib_pypy/numpypy/__init__.py b/lib_pypy/numpypy/__init__.py --- a/lib_pypy/numpypy/__init__.py +++ b/lib_pypy/numpypy/__init__.py @@ -1,5 +1,6 @@ from _numpypy import * from .core import * +from .lib import * import _numpypy __all__ = _numpypy.__all__ diff --git a/lib_pypy/numpypy/core/fromnumeric.py b/lib_pypy/numpypy/core/fromnumeric.py --- a/lib_pypy/numpypy/core/fromnumeric.py +++ b/lib_pypy/numpypy/core/fromnumeric.py @@ -1290,7 +1290,9 @@ array([3, 4, 2, 3, 4, 5, 6, 7, 8, 8]) """ - raise NotImplementedError('Waiting on interp level method') + if not hasattr(a, 'clip'): + a = numpypy.array(a) + return a.clip(a_min, a_max, out=out) def sum(a, axis=None, dtype=None, out=None): diff --git a/lib_pypy/numpypy/core/numeric.py b/lib_pypy/numpypy/core/numeric.py --- a/lib_pypy/numpypy/core/numeric.py +++ b/lib_pypy/numpypy/core/numeric.py @@ -501,3 +501,34 @@ a = asarray(a) b = asarray(b) return a.ravel()[:,newaxis]*b.ravel()[newaxis,:] + +def identity(n, dtype=None): + """ + Return the identity array. + + The identity array is a square array with ones on + the main diagonal. + + Parameters + ---------- + n : int + Number of rows (and columns) in `n` x `n` output. + dtype : data-type, optional + Data-type of the output. Defaults to ``float``. + + Returns + ------- + out : ndarray + `n` x `n` array with its main diagonal set to one, + and all other elements 0. + + Examples + -------- + >>> np.identity(3) + array([[ 1., 0., 0.], + [ 0., 1., 0.], + [ 0., 0., 1.]]) + + """ + from numpy import eye + return eye(n, dtype=dtype) diff --git a/lib_pypy/numpypy/lib/__init__.py b/lib_pypy/numpypy/lib/__init__.py new file mode 100644 --- /dev/null +++ b/lib_pypy/numpypy/lib/__init__.py @@ -0,0 +1,2 @@ +from .function_base import * +from .twodim_base import * diff --git a/lib_pypy/numpypy/lib/function_base.py b/lib_pypy/numpypy/lib/function_base.py new file mode 100644 --- /dev/null +++ b/lib_pypy/numpypy/lib/function_base.py @@ -0,0 +1,8 @@ +from _numpypy import array + +def average(a): + # This implements a weighted average, for now we don't implement the + # weighting, just the average part! + if not hasattr(a, "mean"): + a = array(a) + return a.mean() diff --git a/lib_pypy/numpypy/lib/twodim_base.py b/lib_pypy/numpypy/lib/twodim_base.py new file mode 100644 --- /dev/null +++ b/lib_pypy/numpypy/lib/twodim_base.py @@ -0,0 +1,52 @@ +from _numpypy import zeros + +def eye(N, M=None, k=0, dtype=float): + """ + Return a 2-D array with ones on the diagonal and zeros elsewhere. + + Parameters + ---------- + N : int + Number of rows in the output. + M : int, optional + Number of columns in the output. If None, defaults to `N`. + k : int, optional + Index of the diagonal: 0 (the default) refers to the main diagonal, + a positive value refers to an upper diagonal, and a negative value + to a lower diagonal. + dtype : data-type, optional + Data-type of the returned array. + + Returns + ------- + I : ndarray of shape (N,M) + An array where all elements are equal to zero, except for the `k`-th + diagonal, whose values are equal to one. + + See Also + -------- + identity : (almost) equivalent function + diag : diagonal 2-D array from a 1-D array specified by the user. + + Examples + -------- + >>> np.eye(2, dtype=int) + array([[1, 0], + [0, 1]]) + >>> np.eye(3, k=1) + array([[ 0., 1., 0.], + [ 0., 0., 1.], + [ 0., 0., 0.]]) + + """ + if M is None: + M = N + m = zeros((N, M), dtype=dtype) + if k >= M: + return m + if k >= 0: + i = k + else: + i = (-k) * M + m[:M-k].flat[i::M+1] = 1 + return m diff --git a/pypy/module/micronumpy/__init__.py b/pypy/module/micronumpy/__init__.py --- a/pypy/module/micronumpy/__init__.py +++ b/pypy/module/micronumpy/__init__.py @@ -163,9 +163,6 @@ interpleveldefs[exposed] = "interp_ufuncs.get(space).%s" % impl appleveldefs = { - 'average': 'app_numpy.average', - 'identity': 'app_numpy.identity', - 'eye': 'app_numpy.eye', 'arange': 'app_numpy.arange', } def setup_after_space_initialization(self): diff --git a/pypy/module/micronumpy/app_numpy.py b/pypy/module/micronumpy/app_numpy.py --- a/pypy/module/micronumpy/app_numpy.py +++ b/pypy/module/micronumpy/app_numpy.py @@ -2,39 +2,6 @@ import _numpypy -def average(a): - # This implements a weighted average, for now we don't implement the - # weighting, just the average part! - if not hasattr(a, "mean"): - a = _numpypy.array(a) - return a.mean() - -def identity(n, dtype=None): - a = _numpypy.zeros((n, n), dtype=dtype) - for i in range(n): - a[i][i] = 1 - return a - -def eye(n, m=None, k=0, dtype=None): - if m is None: - m = n - a = _numpypy.zeros((n, m), dtype=dtype) - ni = 0 - mi = 0 - - if k < 0: - p = n + k - ni = -k - else: - p = n - k - mi = k - - while ni < n and mi < m: - a[ni][mi] = 1 - ni += 1 - mi += 1 - return a - def arange(start, stop=None, step=1, dtype=None): '''arange([start], stop[, step], dtype=None) Generate values in the half-interval [start, stop). diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py --- a/pypy/module/micronumpy/interp_numarray.py +++ b/pypy/module/micronumpy/interp_numarray.py @@ -453,13 +453,13 @@ @unwrap_spec(mode=str) def descr_choose(self, space, w_choices, mode='raise', w_out=None): - if w_out is not None and not isinstance(w_out, W_NDimArray): + if not space.is_none(w_out) and not isinstance(w_out, W_NDimArray): raise OperationError(space.w_TypeError, space.wrap( "return arrays must be of ArrayType")) return interp_arrayops.choose(space, self, w_choices, w_out, mode) def descr_clip(self, space, w_min, w_max, w_out=None): - if w_out is not None and not isinstance(w_out, W_NDimArray): + if not space.is_none(w_out) and not isinstance(w_out, W_NDimArray): raise OperationError(space.w_TypeError, space.wrap( "return arrays must be of ArrayType")) min = convert_to_array(space, w_min) diff --git a/pypy/module/micronumpy/test/test_arrayops.py b/pypy/module/micronumpy/test/test_arrayops.py --- a/pypy/module/micronumpy/test/test_arrayops.py +++ b/pypy/module/micronumpy/test/test_arrayops.py @@ -99,10 +99,13 @@ def test_choose_out(self): from _numpypy import array a, b, c = array([1, 2, 3]), [4, 5, 6], 13 + r = array([2, 1, 0]).choose([a, b, c], out=None) + assert (r == [13, 5, 3]).all() + assert (a == [1, 2, 3]).all() r = array([2, 1, 0]).choose([a, b, c], out=a) assert (r == [13, 5, 3]).all() assert (a == [13, 5, 3]).all() - + def test_choose_modes(self): from _numpypy import array a, b, c = array([1, 2, 3]), [4, 5, 6], 13 diff --git a/pypy/module/micronumpy/test/test_complex.py b/pypy/module/micronumpy/test/test_complex.py --- a/pypy/module/micronumpy/test/test_complex.py +++ b/pypy/module/micronumpy/test/test_complex.py @@ -382,7 +382,7 @@ def test_conjugate(self): from _numpypy import conj, conjugate, complex128, complex64 - import _numpypy as np + import numpypy as np c0 = complex128(complex(2.5, 0)) c1 = complex64(complex(1, 2)) diff --git a/pypy/module/micronumpy/test/test_module.py b/pypy/module/micronumpy/test/test_module.py deleted file mode 100644 --- a/pypy/module/micronumpy/test/test_module.py +++ /dev/null @@ -1,8 +0,0 @@ -from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest - - -class AppTestNumPyModule(BaseNumpyAppTest): - def test_average(self): - from _numpypy import array, average - assert average(range(10)) == 4.5 - assert average(array(range(10))) == 4.5 diff --git a/pypy/module/micronumpy/test/test_numarray.py b/pypy/module/micronumpy/test/test_numarray.py --- a/pypy/module/micronumpy/test/test_numarray.py +++ b/pypy/module/micronumpy/test/test_numarray.py @@ -1188,55 +1188,6 @@ assert (array([[1,2],[3,4]]).prod(0) == [3, 8]).all() assert (array([[1,2],[3,4]]).prod(1) == [2, 12]).all() - def test_identity(self): - from _numpypy import identity, array - from _numpypy import int32, float64, dtype - a = identity(0) - assert len(a) == 0 - assert a.dtype == dtype('float64') - assert a.shape == (0, 0) - b = identity(1, dtype=int32) - assert len(b) == 1 - assert b[0][0] == 1 - assert b.shape == (1, 1) - assert b.dtype == dtype('int32') - c = identity(2) - assert c.shape == (2, 2) - assert (c == [[1, 0], [0, 1]]).all() - d = identity(3, dtype='int32') - assert d.shape == (3, 3) - assert d.dtype == dtype('int32') - assert (d == [[1, 0, 0], [0, 1, 0], [0, 0, 1]]).all() - - def test_eye(self): - from _numpypy import eye - from _numpypy import int32, dtype - a = eye(0) - assert len(a) == 0 - assert a.dtype == dtype('float64') - assert a.shape == (0, 0) - b = eye(1, dtype=int32) - assert len(b) == 1 - assert b[0][0] == 1 - assert b.shape == (1, 1) - assert b.dtype == dtype('int32') - c = eye(2) - assert c.shape == (2, 2) - assert (c == [[1, 0], [0, 1]]).all() - d = eye(3, dtype='int32') - assert d.shape == (3, 3) - assert d.dtype == dtype('int32') - assert (d == [[1, 0, 0], [0, 1, 0], [0, 0, 1]]).all() - e = eye(3, 4) - assert e.shape == (3, 4) - assert (e == [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]]).all() - f = eye(2, 4, k=3) - assert f.shape == (2, 4) - assert (f == [[0, 0, 0, 1], [0, 0, 0, 0]]).all() - g = eye(3, 4, k=-1) - assert g.shape == (3, 4) - assert (g == [[0, 0, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0]]).all() - def test_prod(self): from _numpypy import array a = array(range(1, 6)) @@ -1754,7 +1705,8 @@ from _numpypy import array a = array([1, 2, 17, -3, 12]) assert (a.clip(-2, 13) == [1, 2, 13, -2, 12]).all() - assert (a.clip(-1, 1) == [1, 1, 1, -1, 1]).all() + assert (a.clip(-1, 1, out=None) == [1, 1, 1, -1, 1]).all() + assert (a == [1, 2, 17, -3, 12]).all() assert (a.clip(-1, [1, 2, 3, 4, 5]) == [1, 2, 3, -1, 5]).all() assert (a.clip(-2, 13, out=a) == [1, 2, 13, -2, 12]).all() assert (a == [1, 2, 13, -2, 12]).all() diff --git a/pypy/module/test_lib_pypy/numpypy/core/test_fromnumeric.py b/pypy/module/test_lib_pypy/numpypy/core/test_fromnumeric.py --- a/pypy/module/test_lib_pypy/numpypy/core/test_fromnumeric.py +++ b/pypy/module/test_lib_pypy/numpypy/core/test_fromnumeric.py @@ -34,6 +34,20 @@ # a = array([(1, 2), (3, 4)], dtype=[('x', 'i4'), ('y', 'i4')]) # assert shape(a) == (2,) + def test_clip(self): + import numpypy as np + a = np.arange(10) + b = np.clip(a, 1, 8) + assert (b == [1, 1, 2, 3, 4, 5, 6, 7, 8, 8]).all() + assert (a == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]).all() + b = np.clip(a, 3, 6, out=a) + assert (b == [3, 3, 3, 3, 4, 5, 6, 6, 6, 6]).all() + assert (a == [3, 3, 3, 3, 4, 5, 6, 6, 6, 6]).all() + a = np.arange(10) + b = np.clip(a, [3,4,1,1,1,4,4,4,4,4], 8) + assert (b == [3, 4, 2, 3, 4, 5, 6, 7, 8, 8]).all() + assert (a == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]).all() + def test_sum(self): # tests taken from numpy/core/fromnumeric.py docstring from numpypy import array, sum, ones, zeros diff --git a/pypy/module/test_lib_pypy/numpypy/core/test_numeric.py b/pypy/module/test_lib_pypy/numpypy/core/test_numeric.py --- a/pypy/module/test_lib_pypy/numpypy/core/test_numeric.py +++ b/pypy/module/test_lib_pypy/numpypy/core/test_numeric.py @@ -20,6 +20,7 @@ assert base_repr(-12, 10, 4) == '-000012' assert base_repr(-12, 4) == '-30' + class AppTestRepr(BaseNumpyAppTest): def test_repr(self): from numpypy import array @@ -146,10 +147,10 @@ def test_equal(self): from _numpypy import array from numpypy import array_equal - + a = [1, 2, 3] b = [1, 2, 3] - + assert array_equal(a, b) assert array_equal(a, array(b)) assert array_equal(array(a), b) @@ -158,10 +159,10 @@ def test_not_equal(self): from _numpypy import array from numpypy import array_equal - + a = [1, 2, 3] b = [1, 2, 4] - + assert not array_equal(a, b) assert not array_equal(a, array(b)) assert not array_equal(array(a), b) @@ -170,17 +171,17 @@ def test_mismatched_shape(self): from _numpypy import array from numpypy import array_equal - + a = [1, 2, 3] b = [[1, 2, 3], [1, 2, 3]] - + assert not array_equal(a, b) assert not array_equal(a, array(b)) assert not array_equal(array(a), b) assert not array_equal(array(a), array(b)) + class AppTestNumeric(BaseNumpyAppTest): - def test_outer(self): from _numpypy import array from numpypy import outer @@ -192,3 +193,22 @@ [12, 15, 18]]) assert (res == expected).all() + def test_identity(self): + from _numpypy import array, int32, float64, dtype + from numpypy import identity + a = identity(0) + assert len(a) == 0 + assert a.dtype == dtype('float64') + assert a.shape == (0, 0) + b = identity(1, dtype=int32) + assert len(b) == 1 + assert b[0][0] == 1 + assert b.shape == (1, 1) + assert b.dtype == dtype('int32') + c = identity(2) + assert c.shape == (2, 2) + assert (c == [[1, 0], [0, 1]]).all() + d = identity(3, dtype='int32') + assert d.shape == (3, 3) + assert d.dtype == dtype('int32') + assert (d == [[1, 0, 0], [0, 1, 0], [0, 0, 1]]).all() diff --git a/pypy/module/test_lib_pypy/numpypy/lib/test_function_base.py b/pypy/module/test_lib_pypy/numpypy/lib/test_function_base.py new file mode 100644 --- /dev/null +++ b/pypy/module/test_lib_pypy/numpypy/lib/test_function_base.py @@ -0,0 +1,7 @@ +from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest + +class AppTestFunctionBase(BaseNumpyAppTest): + def test_average(self): + from numpypy import array, average + assert average(range(10)) == 4.5 + assert average(array(range(10))) == 4.5 diff --git a/pypy/module/test_lib_pypy/numpypy/lib/test_twodim_base.py b/pypy/module/test_lib_pypy/numpypy/lib/test_twodim_base.py new file mode 100644 --- /dev/null +++ b/pypy/module/test_lib_pypy/numpypy/lib/test_twodim_base.py @@ -0,0 +1,31 @@ +from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest + +class AppTestFunctionBase(BaseNumpyAppTest): + def test_eye(self): + from _numpypy import int32, dtype + from numpypy import eye + a = eye(0) + assert len(a) == 0 + assert a.dtype == dtype('float64') + assert a.shape == (0, 0) + b = eye(1, dtype=int32) + assert len(b) == 1 + assert b[0][0] == 1 + assert b.shape == (1, 1) + assert b.dtype == dtype('int32') + c = eye(2) + assert c.shape == (2, 2) + assert (c == [[1, 0], [0, 1]]).all() + d = eye(3, dtype='int32') + assert d.shape == (3, 3) + assert d.dtype == dtype('int32') + assert (d == [[1, 0, 0], [0, 1, 0], [0, 0, 1]]).all() + e = eye(3, 4) + assert e.shape == (3, 4) + assert (e == [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]]).all() + f = eye(2, 4, k=3) + assert f.shape == (2, 4) + assert (f == [[0, 0, 0, 1], [0, 0, 0, 0]]).all() + g = eye(3, 4, k=-1) + assert g.shape == (3, 4) + assert (g == [[0, 0, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0]]).all() _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit