3

我在 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

4

1 回答 1

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]
于 2013-02-13T01:44:42.033 回答