arrays - 生成指向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数组的第一个值。这也是我希望上面的循环案例所具有的,因为在运行时可以有可变数量的指针。我怎样才能完成这个?
到目前为止我还尝试了什么:
cdef
循环array_ptr
内部,但这在 Cython 中是非法的(cdef
仅允许在第一级)。- 将循环内的部分放入一个函数并具有
cdef
内部函数,但这不起作用
解决方案
指向数组的指针不是 Python 引用计数方案的一部分,因此它们不会阻止数组被销毁。
因此,array_ptr
在每个循环开始时重新分配一次,Python 会破坏它曾经保存的数组。这意味着 的前一个元素proj_points
现在是一个指向不再存在的数组的指针,如果你尝试读取它,你得到的结果是完全未定义的。
您需要保留对您持有指针的任何 numpy 数组的 Python 引用。
推荐阅读
- java - GridDB JAVA API 中的异常
- powershell - 从文件夹中删除用户权限
- javascript - 有没有人在不使用 SharePoint 框架的情况下将 React 或 TypeScript 或两者与 SharePoint 一起使用?
- sql - Presto:发布时区更改为正确区域的表
- c# - 如何判断 SqliteConnection 是否创建了数据库?
- excel - 上一张表中的 VLOOKUP
- php - 使用表时访问刀片中的对象属性
- azure - 使用共享访问签名从 Azure Blob 服务访问 Blob 时是否可以定义自定义错误?
- c# - IoT Edge 模块上的计时器
- java - 如何使用 Eclipse 将 Maven 项目导出到 exe(或 jar)文件?