在 Cython 中将 C++ 向量转换为 numpy 数组而无需复制

0x1*_*337 6 c++ python cython numpy-ndarray

有一个 C++ 函数返回浮点数向量。如何在不复制的情况下将此向量转换为 NumPy 数组?现在我这样做:

cdef np.ndarray arr = np.ascontiguousarray(cpp_vector, dtype=np.float)
return arr
Run Code Online (Sandbox Code Playgroud)

但这在大向量上工作非常慢(假设发生复制)。

iba*_*ond 0

将向量转换为浮点数组并将其告诉 numpy 应该可以解决问题。

\n\n
cdef float[::1] arr = <float [:cpp_vector.size()]>cpp_vector.data()\nreturn arr\n\n# arr is of type Memoryview. To cast into Numpy:\nnp_arr = np.asarray(arr)\n
Run Code Online (Sandbox Code Playgroud)\n\n

[::1]符号指的是Typed MemoryView链接)。在链接中您将获得更多示例。我们还使用np.asarray将 MemoryView 转换为 numpy 数组(在 SO Here中回答)。这个想法是告诉 Cython 以预定义的格式查看该内存空间,避免任何复制。从名为 Coertion 的文档的这一部分扩展到 Numpy

\n\n
\n

Memoryview(和数组)对象可以强制转换为 NumPy ndarray,而无需复制数据。你可以例如这样做:

\n
\n\n
cimport numpy as np\nimport numpy as np\n\nnumpy_array = np.asarray(<np.float_t[:10, :10]> my_pointer)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

当然,你不限于使用 NumPy\xe2\x80\x99s 类型(比如这里的 np.float_\n ),你可以使用任何可用的类型。

\n\n

来源:\n https://cython.readthedocs.io/en/latest/src/userguide/memoryviews.html#coercion-to-numpy

\n
\n

  • 这存在内存管理问题 - 它没有将向量的生命周期与 numpy 数组的生命周期联系起来 (6认同)