summaryrefslogtreecommitdiff
path: root/numpy/core
diff options
context:
space:
mode:
authorMatthew Brett <matthew.brett@gmail.com>2012-09-13 11:26:26 +0100
committerMatthew Brett <matthew.brett@gmail.com>2012-09-16 12:51:53 +0100
commit21a1d73627992d4d904150a0056ae8d55af6f1b5 (patch)
treeee0e444625be859529b8c47788d68ea9b9d9ebe6 /numpy/core
parentd8988abc295ef2d6cf1e3a5ffb0d766ebd4cd3a8 (diff)
downloadnumpy-21a1d73627992d4d904150a0056ae8d55af6f1b5.tar.gz
BUG: allow any axis for np.concatenate for 1D
Previous numpies allowed the user to pass any integer as axis argument to np.concatenate, when the input arrays were 1D. At some point we tightened up on this, raising an error for axis values other than 0. This raises a FutureWarning for axis numbers != 0, but allows them, for backwards compatibility.
Diffstat (limited to 'numpy/core')
-rw-r--r--numpy/core/src/multiarray/multiarraymodule.c8
-rw-r--r--numpy/core/tests/test_shape_base.py65
2 files changed, 71 insertions, 2 deletions
diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c
index 07b7df726..3241a02c7 100644
--- a/numpy/core/src/multiarray/multiarraymodule.c
+++ b/numpy/core/src/multiarray/multiarraymodule.c
@@ -337,6 +337,14 @@ PyArray_ConcatenateArrays(int narrays, PyArrayObject **arrays, int axis)
if (axis < 0) {
axis += ndim;
}
+
+ if (ndim == 1 & axis != 0) {
+ PyErr_WarnEx(PyExc_FutureWarning,
+ "axis not 0 for ndim == 0; this will raise an error "
+ "in future versions of numpy", 2);
+ axis = 0;
+ }
+
if (axis < 0 || axis >= ndim) {
PyErr_Format(PyExc_IndexError,
"axis %d out of bounds [0, %d)", orig_axis, ndim);
diff --git a/numpy/core/tests/test_shape_base.py b/numpy/core/tests/test_shape_base.py
index 2017ca7a3..0325d4a2c 100644
--- a/numpy/core/tests/test_shape_base.py
+++ b/numpy/core/tests/test_shape_base.py
@@ -1,7 +1,7 @@
import warnings
import numpy as np
-from numpy.testing import (TestCase, assert_, assert_raises, assert_equal,
- assert_array_equal, run_module_suite)
+from numpy.testing import (TestCase, assert_, assert_raises, assert_array_equal,
+ assert_equal, run_module_suite)
from numpy.core import (array, arange, atleast_1d, atleast_2d, atleast_3d,
vstack, hstack, newaxis, concatenate)
@@ -40,6 +40,7 @@ class TestAtleast1d(TestCase):
assert_(atleast_1d(3.0).shape == (1,))
assert_(atleast_1d([[2,3],[4,5]]).shape == (2,2))
+
class TestAtleast2d(TestCase):
def test_0D_array(self):
a = array(1); b = array(2);
@@ -100,6 +101,7 @@ class TestAtleast3d(TestCase):
desired = [a,b]
assert_array_equal(res,desired)
+
class TestHstack(TestCase):
def test_0D_array(self):
a = array(1); b = array(2);
@@ -119,6 +121,7 @@ class TestHstack(TestCase):
desired = array([[1,1],[2,2]])
assert_array_equal(res,desired)
+
class TestVstack(TestCase):
def test_0D_array(self):
a = array(1); b = array(2);
@@ -159,5 +162,63 @@ def test_concatenate_axis_None():
'0', '1', '2', 'x'])
assert_array_equal(r,d)
+
+def test_concatenate():
+ # Test concatenate function
+ # No arrays raise ValueError
+ assert_raises(ValueError, concatenate, ())
+ # Scalars cannot be concatenated
+ assert_raises(ValueError, concatenate, (0,))
+ assert_raises(ValueError, concatenate, (array(0),))
+ # One sequence returns unmodified (but as array)
+ r4 = list(range(4))
+ assert_array_equal(concatenate((r4,)), r4)
+ # Any sequence
+ assert_array_equal(concatenate((tuple(r4),)), r4)
+ assert_array_equal(concatenate((array(r4),)), r4)
+ # 1D default concatenation
+ r3 = list(range(3))
+ assert_array_equal(concatenate((r4, r3)), r4 + r3)
+ # Mixed sequence types
+ assert_array_equal(concatenate((tuple(r4), r3)), r4 + r3)
+ assert_array_equal(concatenate((array(r4), r3)), r4 + r3)
+ # Explicit axis specification
+ assert_array_equal(concatenate((r4, r3), 0), r4 + r3)
+ # Including negative
+ assert_array_equal(concatenate((r4, r3), -1), r4 + r3)
+ # 2D
+ a23 = array([[10, 11, 12], [13, 14, 15]])
+ a13 = array([[0, 1, 2]])
+ res = array([[10, 11, 12], [13, 14, 15], [0, 1, 2]])
+ assert_array_equal(concatenate((a23, a13)), res)
+ assert_array_equal(concatenate((a23, a13), 0), res)
+ assert_array_equal(concatenate((a23.T, a13.T), 1), res.T)
+ assert_array_equal(concatenate((a23.T, a13.T), -1), res.T)
+ # Arrays much match shape
+ assert_raises(ValueError, concatenate, (a23.T, a13.T), 0)
+ # 3D
+ res = arange(2 * 3 * 7).reshape((2, 3, 7))
+ a0 = res[..., :4]
+ a1 = res[..., 4:6]
+ a2 = res[..., 6:]
+ assert_array_equal(concatenate((a0, a1, a2), 2), res)
+ assert_array_equal(concatenate((a0, a1, a2), -1), res)
+ assert_array_equal(concatenate((a0.T, a1.T, a2.T), 0), res.T)
+
+
+def test_concatenate_sloppy0():
+ # Versions of numpy < 1.7.0 ignored axis argument value for 1D arrays. We
+ # allow this for now, but in due course we will raise an error
+ r4 = list(range(4))
+ r3 = list(range(3))
+ assert_array_equal(concatenate((r4, r3), 0), r4 + r3)
+ warnings.simplefilter('ignore', FutureWarning)
+ try:
+ assert_array_equal(concatenate((r4, r3), -10), r4 + r3)
+ assert_array_equal(concatenate((r4, r3), 10), r4 + r3)
+ finally:
+ warnings.filters.pop(0)
+
+
if __name__ == "__main__":
run_module_suite()