如何在Cython中切片列表
我在使用cython的时候,有一个列表,我想要对它进行切片操作,但不想用Python对象(这样速度会更快)。
cdef int len = 100
cdef int *q
cdef int *r
q = <int *>malloc( len *cython.sizeof(int) )
r = q[50:]
结果我遇到了这个错误:
r = q[50:]
^
------------------------------------------------------------
hello.pyx:24:9: Slicing is not currently supported for 'int *'.
有没有什么有效的方法可以做到呢?看到“...当前不支持...”这句话让我有点害怕。我用的是cython 0.18。
1 个回答
3
通过使用类型化内存视图,我们可以实现快速切片和一些其他很酷的功能。不过,要进行切片,你需要一些关于数组的元数据,所以最好使用数组类型,而不是普通的指针。如果想了解更多信息,可以查看文档:http://docs.cython.org/src/userguide/memoryviews.html。
对你问题的一个修改可以得到:
cdef int q_array[5] # c array
cdef int[:] q # 1D memview
cdef int[:] r # another 1D memview
q = q_array # point q to data
r = q[2:] # point r to a slice of q
r[0] = 5 # modify r
# test
print q[2]
print r[0]
如果你真的很想从切片中创建指针,也是可以的:
# ...
cdef int* r_ptr
cdef int* q_ptr
r_ptr = &r[0]
q_ptr = &q[0]
print q_ptr[2]
print r_ptr[0]
这也适用于numpy数组:
import numpy as np
cdef int[:] q = np.arange(100).astype('int32') # slow
cdef int[:] r
r = q[50:] # fast slicing
print r[0]