cython-从numpy数组处理字符串

时间:2018-08-11 14:00:07

标签: string numpy cython memoryview

我在包含字符串的numpy数组上生成内存视图时遇到问题。 最终目标是将字符串转换为整数。在这两者之间,我必须使用c函数strtok在适当的位置分割字符串,该函数将指针作为其参数。因此,我不能简单地传递numpy数组中的元素,而必须创建here中所述的内存视图。

这是我的代码

from __future__ import division
import numpy as np
cimport numpy as np
cimport cython 

from libc.string cimport strtok
from libc.stdlib cimport strtod, atoi 

DTYPE = np.int
ctypedef np.int_t DTYPE_t

def str2int(string_array):

    if not string_array.flags['C_CONTIGUOUS']:
        string_array = np.ascontiguousarray(string_array)        

    cdef:
        int n = string_array.shape[0]
        char[::1] arr_memview = string_array
        char *token      
        np.ndarray[DTYPE_t, ndim=1] integer_time = np.zeros(n, dtype=DTYPE)
        np.ndarray[DTYPE_t, ndim=1] conv = np.array([60**2, 60, 1], dtype=DTYPE)
        int count, num 
        size_t i

    for i in range(n):

        token = strtok(&arr_memview[i], ':')

        count = 0
        num = 0
        while token!=NULL:
            num += atoi(token)*conv[count] 
            count +=1 
            token = strtok(NULL, ':')

        integer_time[i] = num

    return integer_time   

pxy文件会编译,但是当我尝试像这样使用

import numpy as np
from strings_to_integers import str2int

strarr = np.array(['00:00:01','00:09:30'], dtype=str)
converted = str2int(strarr)

我在char[::1] arr_memview = string_array行中发现错误:ValueError: Buffer dtype mismatch, expected end but got a string。 (将来可能还会出现其他错误。)

我认为我的问题的答案以某种方式提供了here,但我对它的理解还不够好,无法使我的代码正常工作。例如。当我将有问题的行更改为char[:,::1] arr_memview = string_array并将循环中的第一行更改为token = strtok(&arr_memview[i,0], ':')时,会收到错误消息ValueError: Buffer has wrong number of dimensions (expected 2, got 1)

0 个答案:

没有答案