首页 > 解决方案 > 使用整数的 memoryview 索引 Cython memoryview

问题描述

使用 Cython,我尝试这样做:

cpdef myFun(double[:] array):
    cdef int[:] sortIndices = np.argsort(array, kind='mergesort')
    array = array[sortIndices]

编译器抱怨:

指定的内存视图索引无效,键入 int[:]

如何使用某种整数数组索引此内存视图?只允许切片吗?我可以轻松地使用基于“数组”的索引和旧的 NumPy 数组缓冲区支持。(我只是调整了我的代码以使用 memoryviews 来查看它是否会提高性能,但它实际上会中断......)

标签: python-3.xindexingcythontyped-memory-views

解决方案


@ead 关于自己展开循环的建议是一个很好的建议,但是我很想对底层的 Numpy 数组进行这种类型的索引,您可以使用basememoryview 的属性访问它:

array = array.base[sortIndices]

或者

array = np.asarray(array)[sortIndices]

这样做的好处是可以快速编码,并且只需要对您的工作ndarray代码进行最少的修改。它有几个小缺点:

  • 没有 Cython 加速,因为它基本上是一个 Python 对象调用 - 我希望这无关紧要,因为 Numpy 索引通常非常快,并且假设它sortIndices足够长以否定 Python 对象调用。

  • 如果底层对象实际上不是 Numpy 数组,则第一个版本会中断(因此,与最初出现的 memoryview 接口相比,该函数在可以采用的类型方面受到更多限制。您可以通过使用第二个版本来解决这个问题,这应该创建一个包裹在 memoryview 内存周围的 Numpy 数组。


推荐阅读