将 c char numpy 数组快速转换为 python 字符串列表
Fast conversion of c char numpy array to list of python strings
我正在使用 Cython 在 Python 和 Fortran 代码之间建立接口。其中一部分是检索字符串数组。在 Fortran 中,
character(len=3) :: str_array(:)
为了这个例子,假设 str_array
包含以下内容
allocate(str_array(2))
str_array = ['abc','def']
我的方法是 return 将其作为单个 C 字符数组发送给 Cython。我最终得到了一个字节字符串的 numpy 数组:
c_str_arr = np.array([b'a', b'b', b'c', b'd', b'e', b'f'], dtype='|S1')
然后我使用以下 python 代码将此 numpy 数组转换为 python 字符串列表:
str_len = 3
arr_len = 2
c_str_arr.shape = (arr_len,str_len)
str_arr = []
for i in range(arr_len):
str_arr.append(b''.join(c_str_arr[i]).decode())
但这很慢。
我的问题: 是否有更快的方法将 c_str_arr
转换为 python 字符串列表?
基本上,避免对数组进行迭代。这有点摸不着头脑,但试试看:
bs = c_str_arr.tobytes()
str_arr = [bs[i:i+str_len].decode() for i in range(0, str_len*arr_len, str_len)]
我正在使用 Cython 在 Python 和 Fortran 代码之间建立接口。其中一部分是检索字符串数组。在 Fortran 中,
character(len=3) :: str_array(:)
为了这个例子,假设 str_array
包含以下内容
allocate(str_array(2))
str_array = ['abc','def']
我的方法是 return 将其作为单个 C 字符数组发送给 Cython。我最终得到了一个字节字符串的 numpy 数组:
c_str_arr = np.array([b'a', b'b', b'c', b'd', b'e', b'f'], dtype='|S1')
然后我使用以下 python 代码将此 numpy 数组转换为 python 字符串列表:
str_len = 3
arr_len = 2
c_str_arr.shape = (arr_len,str_len)
str_arr = []
for i in range(arr_len):
str_arr.append(b''.join(c_str_arr[i]).decode())
但这很慢。
我的问题: 是否有更快的方法将 c_str_arr
转换为 python 字符串列表?
基本上,避免对数组进行迭代。这有点摸不着头脑,但试试看:
bs = c_str_arr.tobytes()
str_arr = [bs[i:i+str_len].decode() for i in range(0, str_len*arr_len, str_len)]