gpt4 book ai didi

python - cython:字符串 ndarray 的内存 View (或直接 ndarray 索引)

转载 作者:太空狗 更新时间:2023-10-30 01:01:10 24 4
gpt4 key购买 nike

如何指定包含字符串的 ndarray 的内存 View ?

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)

如果内存 View 不可行,我可以自己实现直接数组访问吗?我需要避免函数 abc(...) 的 GIL。


编辑 1:回应 Bi Rico 的回答。

我的目标是发布函数 abc(...) 的 GIL,并在其中使用 c 字符串函数处理 ndarray in_buffer 的字符串元素。 IE。类似于以下内容:

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)
...

最佳答案

问题是 numpy 数组数据类型必须具有固定大小。当你制作一个“字符串”数组时,你实际上是在制作一个固定长度的 char 数组。试试这个:

import numpy as np

array = np.array(["cat", "in", "a", "hat"])
array[2] = "Seuss"
print(array)
# ['cat' 'in' 'Seu' 'hat']
print(array.dtype)
# dtype('|S3')
print(array.dtype.itemsize)
# 3

考虑到这一点,您可以这样:

cdef void abc(char[:, ::1] in_buffer):
cdef char * element
element = address(in_buffer[1, 0])

然后,当您将数组传递给 abc 时,您需要执行以下操作:

a = np.array(['ABC', 'D', 'EFGHI'])
array_view = a.view('uint8').reshape(a.size, a.dtype.itemsize)
abc(array_view)

这只是一种方法,但我会推荐这种方法,而无需更多地了解您正在尝试做什么。

关于python - cython:字符串 ndarray 的内存 View (或直接 ndarray 索引),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28774096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com