summaryrefslogtreecommitdiff
path: root/numpy/core
diff options
context:
space:
mode:
authorSebastian Berg <sebastian@sipsolutions.net>2015-06-18 13:37:50 +0200
committerSebastian Berg <sebastian@sipsolutions.net>2015-06-18 13:39:46 +0200
commitb26aef66a998b8a6877ee261e4d97ec8f815dad2 (patch)
tree6858544c0643503b6f02502a8e853dc750698003 /numpy/core
parentb72d69ded7790da6ac0f351fe0ce8cf8187e562d (diff)
downloadnumpy-b26aef66a998b8a6877ee261e4d97ec8f815dad2.tar.gz
BUG: Large concatenates with axis=None causing segfault.
This was due to sizes assuming a MAX_ARGS, just remove usage and call PyArray_SIZE each time. Closes gh-5979
Diffstat (limited to 'numpy/core')
-rw-r--r--numpy/core/src/multiarray/multiarraymodule.c9
-rw-r--r--numpy/core/tests/test_shape_base.py13
2 files changed, 18 insertions, 4 deletions
diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c
index 018345e6c..f8656d8c3 100644
--- a/numpy/core/src/multiarray/multiarraymodule.c
+++ b/numpy/core/src/multiarray/multiarraymodule.c
@@ -479,7 +479,7 @@ PyArray_ConcatenateFlattenedArrays(int narrays, PyArrayObject **arrays,
PyTypeObject *subtype = &PyArray_Type;
double priority = NPY_PRIORITY;
int iarrays;
- npy_intp stride, sizes[NPY_MAXDIMS];
+ npy_intp stride;
npy_intp shape = 0;
PyArray_Descr *dtype = NULL;
PyArrayObject *ret = NULL;
@@ -496,7 +496,7 @@ PyArray_ConcatenateFlattenedArrays(int narrays, PyArrayObject **arrays,
* array's shape.
*/
for (iarrays = 0; iarrays < narrays; ++iarrays) {
- shape += sizes[iarrays] = PyArray_SIZE(arrays[iarrays]);
+ shape += PyArray_SIZE(arrays[iarrays]);
/* Check for overflow */
if (shape < 0) {
PyErr_SetString(PyExc_ValueError,
@@ -551,7 +551,7 @@ PyArray_ConcatenateFlattenedArrays(int narrays, PyArrayObject **arrays,
for (iarrays = 0; iarrays < narrays; ++iarrays) {
/* Adjust the window dimensions for this array */
- sliding_view->dimensions[0] = sizes[iarrays];
+ sliding_view->dimensions[0] = PyArray_SIZE(arrays[iarrays]);
/* Copy the data for this array */
if (PyArray_CopyAsFlat((PyArrayObject *)sliding_view, arrays[iarrays],
@@ -562,7 +562,8 @@ PyArray_ConcatenateFlattenedArrays(int narrays, PyArrayObject **arrays,
}
/* Slide to the start of the next window */
- sliding_view->data += sliding_view->strides[0] * sizes[iarrays];
+ sliding_view->data +=
+ sliding_view->strides[0] * PyArray_SIZE(arrays[iarrays]);
}
Py_DECREF(sliding_view);
diff --git a/numpy/core/tests/test_shape_base.py b/numpy/core/tests/test_shape_base.py
index c6399bb07..c387bc616 100644
--- a/numpy/core/tests/test_shape_base.py
+++ b/numpy/core/tests/test_shape_base.py
@@ -172,6 +172,7 @@ class TestVstack(TestCase):
desired = array([[1, 2], [1, 2]])
assert_array_equal(res, desired)
+
def test_concatenate_axis_None():
a = np.arange(4, dtype=np.float64).reshape((2, 2))
b = list(range(3))
@@ -188,6 +189,18 @@ def test_concatenate_axis_None():
assert_array_equal(r, d)
+def test_large_concatenate_axis_None():
+ # When no axis is given, concatenate uses flattened versions.
+ # This also had a bug with many arrays (see gh-5979).
+ x = np.arange(1, 100)
+ r = np.concatenate(x, None)
+ assert_array_equal(x, r)
+
+ # This should probably be deprecated:
+ r = np.concatenate(x, 100) # axis is >= MAXDIMS
+ assert_array_equal(x, r)
+
+
def test_concatenate():
# Test concatenate function
# No arrays raise ValueError