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