首页 > 解决方案 > 生成指向numpy数组的指针列表

问题描述

我在 Cython (0.29) 中实现并使用 numpy (1.15.1)

cdef double *proj_points[1024]
cdef np.ndarray[double, ndim=2, mode="c"] array_ptr

for i in range(2):
    array_ptr = np.ascontiguousarray(self.projection[i] @ points, dtype=np.float)
    proj_points[i] = &array_ptr[0, 0]

在第 1 行中,我定义了指针数组(在堆栈上)。在第 2 行中,我定义了array_ptr用于将 numpy 数组转换为指向 numpy 数组的 C 样式指针。

问题:

当我检查 中的指针时proj_points,它们都指向最后一个 numpy 数组的相同内存元素(即循环中的第二个)。

当前(不满意)的解决方法

如果我做同样的硬编码:

cdef np.ndarray[double, ndim=2, mode="c"] array_ptr0 = np.ascontiguousarray(self.projection[0] @ points, dtype=np.float)
self.proj_points[0] = &array_ptr0[0, 0]

cdef np.ndarray[double, ndim=2, mode="c"] array_ptr1 = np.ascontiguousarray(self.projection[1] @ points, dtype=np.float)
self.proj_points[1] = &array_ptr1[0, 0]

指针都指向对应的numpy数组的第一个值。这也是我希望上面的循环案例所具有的,因为在运行时可以有可变数量的指针。我怎样才能完成这个?

到目前为止我还尝试了什么:

标签: arraysnumpypointerscython

解决方案


指向数组的指针不是 Python 引用计数方案的一部分,因此它们不会阻止数组被销毁。

因此,array_ptr在每个循环开始时重新分配一次,Python 会破坏它曾经保存的数组。这意味着 的前一个元素proj_points现在是一个指向不再存在的数组的指针,如果你尝试读取它,你得到的结果是完全未定义的。

您需要保留对您持有指针的任何 numpy 数组的 Python 引用。


推荐阅读