Commit 21d383ad authored by Dag Sverre Seljebotn's avatar Dag Sverre Seljebotn

Minor optimization of previous change.

parent fd7e2651
...@@ -52,7 +52,9 @@ cdef extern from "numpy/arrayobject.h": ...@@ -52,7 +52,9 @@ cdef extern from "numpy/arrayobject.h":
# requirements, and does not yet fullfill the PEP. # requirements, and does not yet fullfill the PEP.
# In particular strided access is always provided regardless # In particular strided access is always provided regardless
# of flags # of flags
cdef int copy_shape cdef int copy_shape, i, ndim
ndim = PyArray_NDIM(self)
if sizeof(npy_intp) != sizeof(Py_ssize_t): if sizeof(npy_intp) != sizeof(Py_ssize_t):
copy_shape = 1 copy_shape = 1
else: else:
...@@ -67,11 +69,13 @@ cdef extern from "numpy/arrayobject.h": ...@@ -67,11 +69,13 @@ cdef extern from "numpy/arrayobject.h":
raise ValueError("ndarray is not Fortran contiguous") raise ValueError("ndarray is not Fortran contiguous")
info.buf = PyArray_DATA(self) info.buf = PyArray_DATA(self)
info.ndim = PyArray_NDIM(self) info.ndim = ndim
if copy_shape: if copy_shape:
info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * info.ndim) # Allocate new buffer for strides and shape info. This is allocated
info.shape = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * info.ndim) # as one block, strides first.
for i in range(info.ndim): info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)
info.shape = info.strides + ndim
for i in range(ndim):
info.strides[i] = PyArray_STRIDES(self)[i] info.strides[i] = PyArray_STRIDES(self)[i]
info.shape[i] = PyArray_DIMS(self)[i] info.shape[i] = PyArray_DIMS(self)[i]
else: else:
...@@ -185,8 +189,8 @@ cdef extern from "numpy/arrayobject.h": ...@@ -185,8 +189,8 @@ cdef extern from "numpy/arrayobject.h":
# obj is set to NULL in those case) # obj is set to NULL in those case)
stdlib.free(info.format) stdlib.free(info.format)
if sizeof(npy_intp) != sizeof(Py_ssize_t): if sizeof(npy_intp) != sizeof(Py_ssize_t):
stdlib.free(info.shape)
stdlib.free(info.strides) stdlib.free(info.strides)
# info.shape was stored after info.strides in the same block
cdef void* PyArray_DATA(ndarray arr) cdef void* PyArray_DATA(ndarray arr)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment