Skip to content

Commit e1658be

Browse files
committed
Update Cython code to support UDTs
1 parent b5d5144 commit e1658be

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

suitesparse_graphblas/utils.pyx

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ from numpy cimport (
55
NPY_ARRAY_OWNDATA,
66
NPY_ARRAY_WRITEABLE,
77
PyArray_New,
8-
PyArray_SimpleNewFromData,
98
import_array,
109
ndarray,
1110
npy_intp,
@@ -34,8 +33,13 @@ cpdef ndarray claim_buffer(ffi, cdata, size_t size, dtype):
3433
cdef:
3534
npy_intp dims = size
3635
uintptr_t ptr = int(ffi.cast("uintptr_t", cdata))
37-
ndarray array = PyArray_SimpleNewFromData(1, &dims, dtype.num, <void*>ptr)
36+
ndarray array = PyArray_New(
37+
ndarray, 1, &dims, dtype.num, NULL, <void*>ptr, dtype.itemsize,
38+
NPY_ARRAY_WRITEABLE, <object>NULL
39+
)
3840
PyArray_ENABLEFLAGS(array, NPY_ARRAY_OWNDATA)
41+
if dtype.num == 20: # void type, so most likely a UDT
42+
array = array.view(dtype)
3943
return array
4044

4145

@@ -45,18 +49,20 @@ cpdef ndarray claim_buffer_2d(ffi, cdata, size_t cdata_size, size_t nrows, size_
4549
ndarray array
4650
uintptr_t ptr
4751
npy_intp dims[2]
52+
int flags = NPY_ARRAY_WRITEABLE
4853
if cdata_size == size:
4954
ptr = int(ffi.cast("uintptr_t", cdata))
5055
dims[0] = nrows
5156
dims[1] = ncols
52-
if is_c_order:
53-
array = PyArray_SimpleNewFromData(2, dims, dtype.num, <void*>ptr)
54-
else:
55-
array = PyArray_New(
56-
ndarray, 2, dims, dtype.num, NULL, <void*>ptr, -1,
57-
NPY_ARRAY_F_CONTIGUOUS | NPY_ARRAY_WRITEABLE, <object>NULL
58-
)
57+
if not is_c_order:
58+
flags |= NPY_ARRAY_F_CONTIGUOUS
59+
array = PyArray_New(
60+
ndarray, 2, dims, dtype.num, NULL, <void*>ptr, dtype.itemsize,
61+
flags, <object>NULL
62+
)
5963
PyArray_ENABLEFLAGS(array, NPY_ARRAY_OWNDATA)
64+
if dtype.num == 20: # void type, so most likely a UDT
65+
array = array.view(dtype)
6066
elif cdata_size > size: # pragma: no cover
6167
array = claim_buffer(ffi, cdata, cdata_size, dtype)
6268
if is_c_order:

0 commit comments

Comments
 (0)