【问题标题】:Cython 2-D numpy array of mixed types to void**Cython 2-D numpy 混合类型数组为 void**
【发布时间】:2017-03-10 23:24:40
【问题描述】:

我有一个混合类型的 2-D Numpy 数组,我已将其声明为 dtype = 'object',据我所知,这是我可以使用的最通用的 dtype。

arr = np.array([[1,2,3],['Six','Ten','Rodger']], dtype = 'O')

在 Cython 包装器中,我需要将此二维数组转换为 void** 数组,以满足 C++ 端的函数签名。我知道,因为我选择了dtype = 'O',所以分配的内存将比我需要的大,并且不会以其当前形式正确传递给函数。

第二维数组的类型总是一致的 我有一种方法可以从传递给数据结构的其他信息中了解每种类型应该是什么。然后我使用numpy.asarray 转换每个辅助数组并设置相应的void*

arr = np.array([[1,2,3],['Six','Ten','Rodger']], dtype = 'O')
num_entries = arr.shape[1]
cdef void** ptr_arr = <void**> malloc(arr.shape[0]*sizeof(void*))
cdef np.ndarray this_arr

cdef DataType type

for i in range(num_entries):
    type = get_type(tags[i]) # this is where the data's dtype is collected
    ### i = 0 -> dtype is int  i = 1 -> dtype is 'S6' ###
    this_arr = np.asarray(arr[i], dtype = type)
    ptr_arr[i] = <void*> this_arr.data

...但是根据我从 c++ 函数调用返回的结果,这似乎不起作用。

有谁知道可能出了什么问题?

补充:我已经让这种方法适用于int32float64 的混合数据类型,但由于某种原因,它似乎不能很好地处理字符串。这可能与 Numpy 与 C 中空字符的正确填充有关吗?

【问题讨论】:

  • 我不知道 cython,所以这可能完全关闭,但你确定所有 this_arrs 的引用都保留了吗?
  • 你知道你的 C 函数将void*s 转换成什么类型​​的数据吗?它确实需要匹配。
  • @PaulPanzer 我想知道同样的事情,但我认为他们是。将void*'s 作为char*'s 打印到控制台似乎表明它们无论如何都会保留:) @DavidW C 函数应该只将void*'s 转换为函数另一侧的适当类型,但很难确切地知道那里发生了什么……部分原因使这变得特别困难。我所知道的是,这种方法适用于 python 类型 intfloat 的组合,但由于某种原因不适用于字符串。
  • 再一次,我只是在猜测,但是使用.tostring 来查看字符串数组中的字符串表示,例如最长的字符串显然不是以零结尾的。所以我同意你的怀疑,即问题可能在于零。

标签: c++ numpy cython


【解决方案1】:

正如构造的那样,这不是一个数组数组,也不是一个列表列表,或者类似的东西。它是一个 (2,3) 数组,其中每个元素都是一个指针。

In [1]: arr = np.array([[1,2,3],['Six','Ten','Rodger']], dtype = 'O')
In [2]: arr
Out[2]: 
array([[1, 2, 3],
       ['Six', 'Ten', 'Rodger']], dtype=object)
In [3]: arr.shape
Out[3]: (2, 3)
In [4]: arr[0,:]
Out[4]: array([1, 2, 3], dtype=object)
....

这些指针指向内存中其他地方的整数或字符串。

看起来你正试图在 Cython 中做,相当于

In [16]: a2=np.zeros((2,),object)
In [17]: a2[...] =[arr[0].astype(int), arr[1].astype(str)]
In [18]: a2
Out[18]: 
array([array([1, 2, 3]),
       array(['Six', 'Ten', 'Rodger'], 
      dtype='<U6')], dtype=object)

对不起,如果我说的很明显。我正在尝试加快使用cython,但不打算深入了解 C++ 部分。如果没有其余的 Cython 代码,我将无法运行它并亲自查看问题所在。我们只需要相信你的话,有些模糊不清。

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多