diff options
-rw-r--r-- | numpy/core/src/multiarray/multiarraymodule.c | 19 | ||||
-rw-r--r-- | numpy/core/tests/test_regression.py | 10 |
2 files changed, 16 insertions, 13 deletions
diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c index 1f455f528..757f9ea3b 100644 --- a/numpy/core/src/multiarray/multiarraymodule.c +++ b/numpy/core/src/multiarray/multiarraymodule.c @@ -862,6 +862,11 @@ PyArray_InnerProduct(PyObject *op1, PyObject *op2) if (ret == NULL) { goto fail; } + /* Ensure that multiarray.inner(<Nx0>,<Mx0>) -> zeros((N,M)) */ + if (PyArray_SIZE(ap1) == 0 && PyArray_SIZE(ap2) == 0) { + memset(PyArray_DATA(ret), 0, PyArray_NBYTES(ret)); + } + dot = (PyArray_DESCR(ret)->f->dotfunc); if (dot == NULL) { PyErr_SetString(PyExc_ValueError, @@ -876,16 +881,13 @@ PyArray_InnerProduct(PyObject *op1, PyObject *op2) axis = PyArray_NDIM(ap2) - 1; it2 = (PyArrayIterObject *) PyArray_IterAllButAxis((PyObject *)ap2, &axis); NPY_BEGIN_THREADS_DESCR(PyArray_DESCR(ap2)); - while (1) { + while (it1->index < it1->size) { while (it2->index < it2->size) { dot(it1->dataptr, is1, it2->dataptr, is2, op, l, ret); op += os; PyArray_ITER_NEXT(it2); } PyArray_ITER_NEXT(it1); - if (it1->index >= it1->size) { - break; - } PyArray_ITER_RESET(it2); } NPY_END_THREADS_DESCR(PyArray_DESCR(ap2)); @@ -994,10 +996,6 @@ PyArray_MatrixProduct2(PyObject *op1, PyObject *op2, PyArrayObject* out) if (PyArray_SIZE(ap1) == 0 && PyArray_SIZE(ap2) == 0) { memset(PyArray_DATA(ret), 0, PyArray_NBYTES(ret)); } - else { - /* Ensure that multiarray.dot([],[]) -> 0 */ - memset(PyArray_DATA(ret), 0, PyArray_ITEMSIZE(ret)); - } dot = PyArray_DESCR(ret)->f->dotfunc; if (dot == NULL) { @@ -1013,16 +1011,13 @@ PyArray_MatrixProduct2(PyObject *op1, PyObject *op2, PyArrayObject* out) it2 = (PyArrayIterObject *) PyArray_IterAllButAxis((PyObject *)ap2, &matchDim); NPY_BEGIN_THREADS_DESCR(PyArray_DESCR(ap2)); - while (1) { + while (it1->index < it1->size) { while (it2->index < it2->size) { dot(it1->dataptr, is1, it2->dataptr, is2, op, l, ret); op += os; PyArray_ITER_NEXT(it2); } PyArray_ITER_NEXT(it1); - if (it1->index >= it1->size) { - break; - } PyArray_ITER_RESET(it2); } NPY_END_THREADS_DESCR(PyArray_DESCR(ap2)); diff --git a/numpy/core/tests/test_regression.py b/numpy/core/tests/test_regression.py index 5d204617a..02b58a9a6 100644 --- a/numpy/core/tests/test_regression.py +++ b/numpy/core/tests/test_regression.py @@ -209,7 +209,15 @@ class TestRegression(TestCase): """Ticket #106""" x = np.random.randn(0,1) y = np.random.randn(10,1) - z = np.dot(x, np.transpose(y)) + # Dummy array to detect bad memory access: + _z = np.ones(10) + _dummy = np.empty((0, 10)) + z = np.lib.stride_tricks.as_strided(_z, _dummy.shape, _dummy.strides) + np.dot(x, np.transpose(y), out=z) + assert_equal(_z, np.ones(10)) + # Do the same for the built-in dot: + np.core.multiarray.dot(x, np.transpose(y), out=z) + assert_equal(_z, np.ones(10)) def test_arange_endian(self,level=rlevel): """Ticket #111""" |