如何指定包含字符串的ndarray的内存视图?
char [:]
, char* [:]
等方法均不可用。
为了说明我的问题,我的函数abc(...)
的定义如下:
cdef void abc(char[:] in_buffer):
cdef char * element
element = address(in_buffer[1])
...
def main():
cdef Py_ssize_t i, n = 100
a = np.array(['ABC', 'D', 'EFGHI'])
for i in range(n):
abc(a)
如果无法使用memoryview,我是否可以自己实现直接数组访问?我需要在函数
abc(...)
中避免GIL。
编辑1:回复Bi Rico的答案。
我的目标是为了函数abc(...)
释放GIL,并在其中使用c字符串函数处理ndarray in_buffer
的字符串元素。也就是像下面这样做:
cdef void abc(char[:, ::1] in_buffer) nogil:
cdef int max_elt_length = in_buffer.shape[1]+1
cdef char element[max_elt_length+1]
cdef int length
for i in range(in_buffer.shape[0]+1): # is this equivalent to in_buffer.dtype.itemsize + 1 ?
element[max_elt_length] = 0 # add null-terminator for full-size elements
memcpy(element, address(buffer[i, 0]), max_length)
length = strlen(element)
...
char[:, ::1]
内存视图定义中的::1
部分的文档说明? - ARF::1
表示输入缓冲区应该是 C 连续的。你的更新代码原则上看起来没问题,但是有一些差一的错误。我认为应该是range(in_buffer.shape[0])
和max_elt_length = in_buffer.shape[1]
。最后,in_buffer
没有dtype
属性。in_buffer.shape[0]
是原始数组中字符串的数量。 - Bi Rico