我在包含字符串的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)
。