在 Python3 会话中,您的a5
数组包含字节串。
In [165]: np.array(['12345', '67890', '22343'], dtype='a5')
Out[165]:
array([b'12345', b'67890', b'22343'],
dtype='|S5')
http://cython.readthedocs.io/en/latest/src/tutorial/strings.html http://cython.readthedocs.io/en/latest/src/tutorial/strings.html说str
用Python3编译时是unicode字符串类型。
我怀疑np.array(['12345', '67890', '22343'], dtype='U5')
将被接受作为函数的输入数组。但复制到a5
out_arr
会有问题。
对象版本
此循环的对象版本有效:
cpdef str[:] objcopy(str[:] in_arr):
cdef str[:] out_arr = np.zeros(in_arr.shape[0], dtype=object)
cdef int N
N = in_arr.shape[0]
for i in range(N):
out_arr[i] = in_arr[i]
return out_arr
narr = np.array(['one','two','three'], dtype=object)
cpy = objcopy(narr)
print(cpy)
print(np.array(cpy))
print(np.array(objcopy(np.array([None,'one', 23.4]))))
这些函数返回一个内存视图,必须将其转换为数组才能打印。
单字符版本
单字节内存视图副本:
cpdef char[:] chrcopy(char[:] in_arr):
cdef char[:] out_arr = np.zeros(in_arr.shape[0], dtype='uint8')
cdef int N
N = in_arr.shape[0]
for i in range(N):
out_arr[i] = in_arr[i]
return out_arr
print(np.array(chrcopy(np.array([b'one',b'two',b'three']).view('S1'))).view('S5'))
Uses view
将字符串转换为单个字节并返回。
2d unicode 版本
我去年研究过这个问题:Cython:将unicode存储在numpy数组中 https://stackoverflow.com/questions/35698179/cython-storing-unicode-in-numpy-array
这会像处理 2d int 数组的行一样处理 unicode 字符串;之前和之后都需要重塑。
cpdef int[:,:] int2dcopy(int[:,:] in_arr):
cdef int[:,:] out_arr = np.zeros((in_arr.shape[0], in_arr.shape[1]), dtype=int)
cdef int N
N = in_arr.shape[0]
for i in range(N):
out_arr[i,:] = in_arr[i,:]
return out_arr
narr = np.array(['one','two','three', 'four', 'five'], dtype='U5')
cpy = int2dcopy(narr.view('int').reshape(-1,5))
print(cpy)
print(np.array(cpy))
print(np.array(cpy).view(narr.dtype)) # .reshape(-1)
对于字节串,类似的 2dchar
版本应该可以工作。
C 结构体版本
byte5 = cython.struct(x=cython.char[5])
cpdef byte5[:] byte5copy(byte5[:] in_arr):
cdef byte5[:] out_arr = np.zeros(in_arr.shape[0], dtype='|S5')
cdef int N
N = in_arr.shape[0]
for i in range(N):
out_arr[i] = in_arr[i]
return out_arr
narr = np.array(['one','four','six'], dtype='|S5')
cpy = byte5copy(narr)
print(cpy)
print(repr(np.array(cpy)))
# array([b'one', b'four', b'six'], dtype='|S5')
C 结构正在创建一个具有 5 个字节元素的内存视图,该元素映射到数组S5
元素。
https://github.com/cython/cython/blob/master/tests/memoryview/numpy_memoryview.pyx https://github.com/cython/cython/blob/master/tests/memoryview/numpy_memoryview.pyx还有一个带有字节串的结构化数组示例。