在cython中使用迭代器

2024-06-09 10:33:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图学习cython,我修改了发现的示例here。在

#pyx file

import numpy as np
cimport numpy as np
import cython

np.import_array()

def test1(a):
    out = np.empty(a.shape, np.double)

    cdef np.flatiter ita = np.PyArray_IterNew(a)
    cdef np.flatiter ito = np.PyArray_IterNew(out)

    cdef double value

    cdef double i
    i = 0.0

    while np.PyArray_ITER_NOTDONE(ita):

        value = (<double*>np.PyArray_ITER_DATA(ita))[0]

        print(ita)  # for debugging
        print(value,i)  # for debugging

        value = value + i

        (<double*>np.PyArray_ITER_DATA(ito))[0] = value

        i += 1.0

        np.PyArray_ITER_NEXT(ita)
        np.PyArray_ITER_NEXT(ito)

    return out

因此,我希望函数通过i来添加输入数组的每个元素,其中{}的值每次迭代器传递到下一个元素时增加一个。当我用a=np.arange(10)运行函数时,print语句显示如下内容:

^{pr2}$

这不是我所期望的,因为迭代器似乎仍然指向数组的同一个元素,value返回的值本质上是零,但不是{}(数字0-9)的值。但是迭代器似乎在结束时停止,因为函数成功终止并且返回的数组的形状与a相同。在

所以我的问题是:

  1. 这行value = (<double*>np.PyArray_ITER_DATA(ita))[0]实际上是什么意思?<double*>声明指针类型?np.PyArray_ITER_DATA正是API所说的。那么[0]呢?

  2. 我出了什么问题?如何修改代码?如果a=np.arange(2,8),那么{}应该给出{}。


Tags: 函数import元素datavaluenp数组out
1条回答
网友
1楼 · 发布于 2024-06-09 10:33:21

问题是arange在默认情况下给你一个int数组,然后你把它解释成double数组(被误解为双精度的小整数通常在1e-300左右,所以这通常是一个很好的线索)。理想情况下,您应该确保检查函数中的dtype。在

回答您进一步的问题:

print(ita)正在打印迭代器对象的地址,而不是它当前访问的数据。因此它总是显示相同的地址。在

np.PyArray_ITER_DATA(ita)获取指向当前数据位地址的指针。因为它被设计成任何numpy数组的通用接口,我们不知道它的类型,所以它是void*<double*>你告诉Cython这个指针实际上指向一个double[0]查找存储在该指针上的值

相关问题 更多 >