@@ -771,6 +771,81 @@ array_indexing(PyObject *NPY_UNUSED(self), PyObject *args)
771
771
return NULL;
772
772
}
773
773
774
+ /*
775
+ * Test C-api PyArray_AsCArray item getter
776
+ */
777
+ static PyObject *
778
+ test_as_c_array(PyObject *NPY_UNUSED(self), PyObject *args)
779
+ {
780
+ PyArrayObject *array_obj;
781
+ npy_intp dims[3]; // max 3-dim
782
+ npy_intp i=0, j=0, k=0;
783
+ npy_intp num_dims = 0;
784
+ PyArray_Descr *descr = NULL;
785
+ double *array1 = NULL;
786
+ double **array2 = NULL;
787
+ double ***array3 = NULL;
788
+ double temp = 9999;
789
+
790
+ if (!PyArg_ParseTuple(args, "O!l|ll",
791
+ &PyArray_Type, &array_obj,
792
+ &i, &j, &k)) {
793
+ return NULL;
794
+ }
795
+
796
+ if (NULL == array_obj) {
797
+ return NULL;
798
+ }
799
+
800
+ num_dims = PyArray_NDIM(array_obj);
801
+ descr = PyArray_DESCR(array_obj);
802
+
803
+ switch (num_dims) {
804
+ case 1:
805
+ if (PyArray_AsCArray(
806
+ (PyObject **) &array_obj,
807
+ (void *) &array1,
808
+ dims,
809
+ 1,
810
+ descr) < 0) {
811
+ PyErr_SetString(PyExc_RuntimeError, "error converting 1D array");
812
+ return NULL;
813
+ }
814
+ temp = array1[i];
815
+ PyArray_Free((PyObject *) array_obj, (void *) array1);
816
+ break;
817
+ case 2:
818
+ if (PyArray_AsCArray(
819
+ (PyObject **) &array_obj,
820
+ (void **) &array2,
821
+ dims,
822
+ 2,
823
+ descr) < 0) {
824
+ PyErr_SetString(PyExc_RuntimeError, "error converting 2D array");
825
+ return NULL;
826
+ }
827
+ temp = array2[i][j];
828
+ PyArray_Free((PyObject *) array_obj, (void *) array2);
829
+ break;
830
+ case 3:
831
+ if (PyArray_AsCArray(
832
+ (PyObject **) &array_obj,
833
+ (void ***) &array3,
834
+ dims,
835
+ 3,
836
+ descr) < 0) {
837
+ PyErr_SetString(PyExc_RuntimeError, "error converting 3D array");
838
+ return NULL;
839
+ }
840
+ temp = array3[i][j][k];
841
+ PyArray_Free((PyObject *) array_obj, (void *) array3);
842
+ break;
843
+ default:
844
+ PyErr_SetString(PyExc_ValueError, "array.ndim not in [1, 3]");
845
+ return NULL;
846
+ }
847
+ return Py_BuildValue("f", temp);
848
+ }
774
849
775
850
/*
776
851
* Test nditer of too large arrays using remove axis, etc.
@@ -911,6 +986,9 @@ static PyMethodDef Multiarray_TestsMethods[] = {
911
986
{"array_indexing",
912
987
array_indexing,
913
988
METH_VARARGS, NULL},
989
+ {"test_as_c_array",
990
+ test_as_c_array,
991
+ METH_VARARGS, NULL},
914
992
{"test_nditer_too_large",
915
993
test_nditer_too_large,
916
994
METH_VARARGS, NULL},
0 commit comments