gpt4 book ai didi

python - 如何在cython中切片列表

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:36 24 4
gpt4 key购买 nike

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

最佳答案

通过 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]

关于python - 如何在cython中切片列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14840097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com