【问题标题】:Numpy C-API: PyArrayObject provides wrong dimensionsNumpy C-API:PyArrayObject 提供错误的维度
【发布时间】: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。

标签: python c numpy


【解决方案1】:

似乎这是最新的 numpy 版本和 Python 3.4 的某种错误。切换到 Python 3.5 后,该函数提供了预期的行为。

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 2021-12-02
    • 2020-08-24
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2011-08-09
    • 2020-04-27
    相关资源
    最近更新 更多