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