我正在尝试加速Python脚本。我已经在纯Python中分析了代码并重新分解了很多内容。似乎我仍在花费大量时间访问一些numpy数组,其方式如下:

KeyArray[BoolArray[index]]

其中KeyArray是ndim=2并且包含字符串,BoolArray是ndim=1并且包含bool并且index是一个int
我正试着学习赛顿,看看它能有多快。我写的以下脚本不起作用:
import numpy as np
cimport numpy as np

def fastindexer(np.ndarray[np.str_t,ndim=1] KeyArray, np.ndarray [np.bool_t,ndim=2] BoolArray, np.int_t DateIndex):
    cdef np.ndarray[np.str_t,ndim=1] FArray = KeyArray[BoolArray[DateIndex]]
    return FArray

我知道str/bool类型在np数组中不可用。我也试过投,但我不明白该怎么写。
欢迎大家帮忙

最佳答案

正如乔所说的,把一个索引语句移到Cython不会给你速度。如果你决定把更多的程序移到Cython,你需要解决一些问题。
1)使用def而不是cdef,仅限于Python功能。
2)使用旧的缓冲区语法。阅读memoryviews
3)切片二维数组很慢,因为每次都会创建一个新的memoryview。也就是说,它仍然比Python快得多,但是要获得最高性能,您必须使用不同的方法。
这里有些东西可以让你开始。

cpdef func():
   cdef int i
   cdef bool[:] my_bool_array = np.zeros(10, dtype=bool)
   # I'm not if this next line is correct
   cdef char[:,:] my_string_array = np.chararray((10, 10))
   cdef char answer

   for i in range(10):
       answer = my_string_array[ my_bool_array[i] ]

09-10 01:54
查看更多