如何在cython中切片列表

时间:2013-02-12 19:18:35

标签: python list cython slice

我在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 个答案:

答案 0 :(得分:3)

通过Typed Memoryviews可以快速切片和其他一些很酷的东西。但是为了进行切片,你需要一些关于你的数组的元数据,所以最好使用数组类型而不是普通指针。查找文档以获取更多信息: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]