【发布时间】:2017-03-21 20:56:28
【问题描述】:
我正在尝试访问 C 中 numpy 数组的数组维度。
src.c
static PyObject*
array_dims(PyObject *NPY_UNUSED(ignored), PyObject *args, PyObject *kwds)
{
PyArrayObject *arg1=NULL;
int i;
// check for exactly one input argument and parse it to arg1
if (!PyArg_ParseTuple(args, "O!", &PyArray_Type, &arg1)) return NULL;
for(i = 0; i < PyArray_NDIM(arg1); i++){
printf("%d \n", PyArray_DIMS(arg1)[i]);
}
return(Py_None);
}
run.py
import numpy as np
arr = np.asarray([[1,2,3],[3,4,5],[7,8,9]])
src.dims(arr)
控制台输出
3
0
第一个是正确的,但是对于 i=1,形状也应该是 3。进一步调查表明,对于 i=2(手动调用),输出也是“3”,这可能是偶然的,也可能是一些系统错误。
我也尝试了 arg1->dimensions 或 PyArray_SHAPE(arg1) 但都显示了相同的结果。
【问题讨论】:
-
等等,你的
array_dims函数只需要一个参数,但你要传递两个参数? -
为了更好地阅读,我稍微修改了代码,我在示例中纠正了这个错误。
-
%d实际上是正确的格式说明符吗?npy_intp不一定是int。 -
我也尝试将它类型转换为 int,但这并没有什么不同。我还比较了 int 和 npy_intp 的大小,都是 4B。