Author: mattip Branch: numpypy-is_contiguous Changeset: r50225:b8c87c4cf664 Date: 2011-12-06 22:14 +0200 http://bitbucket.org/pypy/pypy/changeset/b8c87c4cf664/
Log: test, implement is_contiguous for C order 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 @@ -155,6 +155,27 @@ last_step *= shape[i] return steps +def is_contiguous(arr): + #Only views can be non-contiguous + if isinstance(arr, ViewArray): + steps = calc_steps(arr.shape, arr.strides) + for i in range(1, len(steps)): + if steps[i] != steps[0]: + return False + return True + +def is_contiguous_lr(arr): + if arr.strides[-1] < arr.strides[0]: + #rl, not lr + return False + return is_contiguous(arr) + +def is_contiguous_rl(self): + if arr.strides[-1] > arr.strides[0]: + #lr, not rl + return False + return is_contiguous(arr) + #Recalculating strides. Find the steps that the iteration does for each #dimension, given the stride and shape. Then try to create a new stride that #fits the new shape, using those steps. If there is a shape/step mismatch @@ -192,7 +213,8 @@ n_new_elems_used = 1 oldI = -1 n_old_elems_to_use = old_shape[-1] - for s in new_shape[::-1]: + for i in range(len(new_shape) - 1, -1, -1): + s = new_shape[i] new_strides.insert(0, cur_step * n_new_elems_used) n_new_elems_used *= s while n_new_elems_used > n_old_elems_to_use: 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 @@ -166,6 +166,23 @@ assert calc_new_strides([24], [2, 4, 3], [48, 6, 1]) is None assert calc_new_strides([24], [2, 4, 3], [24, 6, 2]) == [2] + def test_contiguousC(self): + from pypy.module.micronumpy.interp_numarray import is_contiguous, + is_contiguous_rl, is_contiguous_lr + a = W_NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'C') + assert is_contiguous(a) == True + assert is_contiguous_lr(a) == False + assert is_contiguous_rl(a) == True + b = a.descr_get_transpose(self.space) + assert is_contiguous(b) == True + assert is_contiguous_lr(b) == True + assert is_contiguous_rl(b) == False + b = a.create_slice(self.space, [(0, 10, 2, 5)]) + assert is_contiguous(b) == False + assert is_contiguous_lr(b) == False + assert is_contiguous_rl(b) == False + + class AppTestNumArray(BaseNumpyAppTest): def test_ndarray(self): from numpypy import ndarray, array, dtype _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit