我有一个混合类型的二维Numpy数组,我声明它是dtype ='object',据我所知,这是我可以使用的最通用的dtype。
arr = np.array([[1,2,3],['Six','Ten','Rodger']], dtype = 'O')
在Cython包装器中,我需要将这个2-D数组转换为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
的混合dtypes,但由于某些原因它似乎不能很好地与字符串配合使用。它可能与Numpy与C中的空字符的正确填充有关吗?
答案 0 :(得分:0)
构造时,这不是数组数组,列表列表或类似内容。它是一个(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代码,我无法运行它,看看自己出了什么问题。我们只需要说出一些含糊不清的错误。