python-3.x - 使用整数的 memoryview 索引 Cython memoryview
问题描述
使用 Cython,我尝试这样做:
cpdef myFun(double[:] array):
cdef int[:] sortIndices = np.argsort(array, kind='mergesort')
array = array[sortIndices]
编译器抱怨:
指定的内存视图索引无效,键入 int[:]
如何使用某种整数数组索引此内存视图?只允许切片吗?我可以轻松地使用基于“数组”的索引和旧的 NumPy 数组缓冲区支持。(我只是调整了我的代码以使用 memoryviews 来查看它是否会提高性能,但它实际上会中断......)
解决方案
@ead 关于自己展开循环的建议是一个很好的建议,但是我很想对底层的 Numpy 数组进行这种类型的索引,您可以使用base
memoryview 的属性访问它:
array = array.base[sortIndices]
或者
array = np.asarray(array)[sortIndices]
这样做的好处是可以快速编码,并且只需要对您的工作ndarray
代码进行最少的修改。它有几个小缺点:
没有 Cython 加速,因为它基本上是一个 Python 对象调用 - 我希望这无关紧要,因为 Numpy 索引通常非常快,并且假设它
sortIndices
足够长以否定 Python 对象调用。如果底层对象实际上不是 Numpy 数组,则第一个版本会中断(因此,与最初出现的 memoryview 接口相比,该函数在可以采用的类型方面受到更多限制。您可以通过使用第二个版本来解决这个问题,这应该创建一个包裹在 memoryview 内存周围的 Numpy 数组。
推荐阅读
- java - 我不知道为什么 JLabel 没有显示
- flutter - 我需要将纬度和经度从rest api转换为listview
- excel - 将字典存储在数组中
- wso2 - WSO2 Microgateway 对 Soap API 的支持
- php - 如果库可以做同样的事情,CodeIgniter 中帮助程序的实际用途是什么?
- blazor-webassembly - 使用 Blazor 作为组件
- macos - 通过互联网在 OSX 平台上进行远程管理(动态 ip)
- python - 如何在txt中写入参数名称和值列表?
- azure - 获取 azure 存储表字段类型
- reactjs - react.js 中出现错误,TypeError: Cannot read property 'map' of undefined