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)
但这在大向量上工作非常慢(假设发生复制)。
将向量转换为浮点数组并将其告诉 numpy 应该可以解决问题。
\n\ncdef 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)\nRun Code Online (Sandbox Code Playgroud)\n\n该[::1]符号指的是Typed MemoryView(链接)。在链接中您将获得更多示例。我们还使用np.asarray将 MemoryView 转换为 numpy 数组(在 SO Here中回答)。这个想法是告诉 Cython 以预定义的格式查看该内存空间,避免任何复制。从名为 Coertion 的文档的这一部分扩展到 Numpy:
\n\n\nMemoryview(和数组)对象可以强制转换为 NumPy ndarray,而无需复制数据。你可以例如这样做:
\n
cimport numpy as np\nimport numpy as np\n\nnumpy_array = np.asarray(<np.float_t[:10, :10]> my_pointer)\nRun Code Online (Sandbox Code Playgroud)\n\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
| 归档时间: |
|
| 查看次数: |
1265 次 |
| 最近记录: |