【发布时间】:2023-03-22 07:23:01
【问题描述】:
是否可以使用 PyArray_NewFromDescr 从一组连续的二维数组创建 numpy 数组对象,而无需复制数据?
【问题讨论】:
标签: c++ python numpy python-c-api
是否可以使用 PyArray_NewFromDescr 从一组连续的二维数组创建 numpy 数组对象,而无需复制数据?
【问题讨论】:
标签: c++ python numpy python-c-api
您的帖子有轻微的不一致;我假设您的标题描述了您想要的内容。查看 Python API 文档,PyArray_NewFromDescr 只接受一个指向预分配内存的指针,所以答案几乎肯定是否定的。看来您可能可以巧妙地使用strides 参数来实现这一点;但即便如此,非连续内存也必须以常规方式布局。
此外,从PyArray_CheckStrides 来看,这显然不是 numpy 想要你做的,它似乎假设了一个连续的内存块。
【讨论】:
简短的回答,不。
Numpy 期望所有数据都以简单的跨步模式放置。当迭代数组时,为了在一个维度上前进,它会在内存中的位置添加一个常量,即该维度的步幅大小。因此,除非您的 2-d 切片定期布局(例如,较大的 3-d 数组的每隔一行),numpy 将需要复制数据。
如果您确实有该订单,您可以做您想做的事。您需要创建一个 PyArray 结构,其中数据指向第一项,步幅对于布局是正确的,并且描述也是正确的。最重要的是,您需要将基本成员设置为另一个 python 对象,以在此视图存在时保持大块内存处于活动状态。
【讨论】: