【发布时间】: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++ 函数调用返回的结果,这似乎不起作用。
有谁知道可能出了什么问题?
补充:我已经让这种方法适用于int32 和float64 的混合数据类型,但由于某种原因,它似乎不能很好地处理字符串。这可能与 Numpy 与 C 中空字符的正确填充有关吗?
【问题讨论】:
-
我不知道 cython,所以这可能完全关闭,但你确定所有
this_arrs 的引用都保留了吗? -
你知道你的 C 函数将
void*s 转换成什么类型的数据吗?它确实需要匹配。 -
@PaulPanzer 我想知道同样的事情,但我认为他们是。将
void*'s 作为char*'s 打印到控制台似乎表明它们无论如何都会保留:) @DavidW C 函数应该只将void*'s 转换为函数另一侧的适当类型,但很难确切地知道那里发生了什么……部分原因使这变得特别困难。我所知道的是,这种方法适用于 python 类型int和float的组合,但由于某种原因不适用于字符串。 -
再一次,我只是在猜测,但是使用
.tostring来查看字符串数组中的字符串表示,例如最长的字符串显然不是以零结尾的。所以我同意你的怀疑,即问题可能在于零。