【问题标题】:Convert pointer to pointer in C++ to Numpy Array in Cython将 C++ 中指向指针的指针转换为 Cython 中的 Numpy 数组
【发布时间】:2021-08-03 06:02:08
【问题描述】:

我正在研究一种利用 Cython 和 C++ 代码来加速计算的算法。部分计算涉及跟踪二维矩阵vecs,即 D x D' 维度(例如 1000 x 100)。该算法在 Cython 中并行化以设置每列的值。然后我有兴趣在 Python 中将 vecs 值作为 NumPy 数组获取。

在 Cython 中修改 vecs

设置vecs每一列的伪代码如下:

# this occurs in a Cython/C++ function
for icolumn in range(D'):
   for irow in range(D):
      vecs[irow, icolumn] = val

vecs 的数据结构

为了表示这样一个矩阵,我使用了npy_float32 类型的指针(我认为它只是numpy 的float 32 类型)。我现在有一个指向指针数组的指针,如下所示:

ctypedef np.npy_float32 DTYPE_t    
cdef DTYPE_t** vecs             # (D, D') array of vectors

目标是在 Python 级别获取 NumPy 数组中的向量

我有兴趣将这个 vecs 变量转换为 numpy 数组。这是我的尝试,但它不起作用。我是 C++ 和 Cython 的新手。

numpy_vec_arr = np.asarray(<DTYPE_t[:,:]> proj_vecs_arr)

【问题讨论】:

  • C++ 库究竟做了什么?转换为numpy?你有什么建议吗?
  • Cython 代码第一部分中的 vecs 是什么?如果您使用诸如 cdef float[:] vecs = np.zeros() 之类的 MemoryViews,您可以稍后使用 return vecs.base 将其取回

标签: python c++ arrays numpy cython


【解决方案1】:

我不是 NumPy 和 Cython 方面的专家,但我确实了解 C++ 以及 C++ 与其他语言的互操作。

你想解决什么问题?

回答这将防止 XY 问题,并可能让这里的人们更好地帮助你。

现在,回答您最初的问题。我看到了两种方法。

  1. 使用 NumPy 数组的可用构造函数来构造 NumPy 数组。这显然会给你一个 NumPy 数组,问题解决了。
  2. 创建一个与 Python 期望的 NumPy 数组具有相同内存结构的对象,然后将该对象转换为 NumPy 数组。这很棘手,容易出错,并且取决于许多实现细节。由于这些原因,我不建议采用这种方法。

【讨论】:

  • 嗨@brbusby,感谢您的回复。我添加了额外的细节。我不确定有多少信息是无用的还是有用的。希望这能提供更多关于我要解决的问题的信息?
  • 要与 numpy 数组互操作,您需要一个指向平面数据缓冲区的指针,例如C 风格的数组。然后从 Cython 中,使用类型化的内存视图,正如您在 OP 中所写的那样。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多