@@ -719,6 +719,78 @@ array_indexing(PyObject *NPY_UNUSED(self), PyObject *args)
719
719
return NULL;
720
720
}
721
721
722
+ /*
723
+ * Test C-api PyArray_AsCArray item getter
724
+ */
725
+ static PyObject *
726
+ test_as_c_array(PyObject *NPY_UNUSED(self), PyObject *args)
727
+ {
728
+ PyArrayObject *array_obj;
729
+ npy_intp i=0, j=0, k=0;
730
+ if (!PyArg_ParseTuple(args, "O!l|ll",
731
+ &PyArray_Type, &array_obj,
732
+ &i, &j, &k)) {
733
+ return NULL;
734
+ }
735
+
736
+ if (NULL == array_obj) {
737
+ return NULL;
738
+ }
739
+
740
+ npy_intp dims[3]; // max 3-dim
741
+ npy_intp num_dims = PyArray_NDIM(array_obj);
742
+ PyArray_Descr *descr = PyArray_DESCR(array_obj);
743
+
744
+ double *array1 = NULL;
745
+ double **array2 = NULL;
746
+ double ***array3 = NULL;
747
+ double temp;
748
+
749
+ switch (num_dims) {
750
+ case 1:
751
+ if (PyArray_AsCArray(
752
+ (PyObject **) &array_obj,
753
+ (void *) &array1,
754
+ dims,
755
+ 1,
756
+ descr) < 0) {
757
+ PyErr_SetString(PyExc_RuntimeError, "error converting 1D array");
758
+ return NULL;
759
+ }
760
+ temp = array1[i];
761
+ PyArray_Free((PyObject *) array_obj, (void *) array1);
762
+ break;
763
+ case 2:
764
+ if (PyArray_AsCArray(
765
+ (PyObject **) &array_obj,
766
+ (void **) &array2,
767
+ dims,
768
+ 2,
769
+ descr) < 0) {
770
+ PyErr_SetString(PyExc_RuntimeError, "error converting 2D array");
771
+ return NULL;
772
+ }
773
+ temp = array2[i][j];
774
+ PyArray_Free((PyObject *) array_obj, (void *) array2);
775
+ break;
776
+ case 3:
777
+ if (PyArray_AsCArray(
778
+ (PyObject **) &array_obj,
779
+ (void ***) &array3,
780
+ dims,
781
+ 3,
782
+ descr) < 0) {
783
+ PyErr_SetString(PyExc_RuntimeError, "error converting 3D array");
784
+ return NULL;
785
+ }
786
+ temp = array3[i][j][k];
787
+ PyArray_Free((PyObject *) array_obj, (void *) array3);
788
+ break;
789
+ default:
790
+ PyErr_SetString(PyExc_ValueError, "array.ndim not in [1, 3]");
791
+ }
792
+ return Py_BuildValue("f", temp);
793
+ }
722
794
723
795
/*
724
796
* Test nditer of too large arrays using remove axis, etc.
@@ -850,6 +922,9 @@ static PyMethodDef Multiarray_TestsMethods[] = {
850
922
{"array_indexing",
851
923
array_indexing,
852
924
METH_VARARGS, NULL},
925
+ {"test_as_c_array",
926
+ test_as_c_array,
927
+ METH_VARARGS, NULL},
853
928
{"test_nditer_too_large",
854
929
test_nditer_too_large,
855
930
METH_VARARGS, NULL},
0 commit comments