恐怕不可能像 numpy 可以使用 int-arrays 那样使用类型化的内存视图作为索引。
Cython 的文档指出
内存视图以与 NumPy 类似的方式使用 Python 切片语法。
“相似”意味着它对于整数、切片:
(...
None
numpy.newaxis('None')
负责生成对类型化内存视图的访问的 Cython 代码是generate_buffer_slice_code
,您所需要知道的都在 doc-string 中:
"""
Slice a memoryviewslice.
indices - list of index nodes.
If not a SliceNode, or NoneNode, then it must be coercible to Py_ssize_t
....
"""
因此array
,既不是 SliceNode(即:
,...
或 eg 0:33
),也不None
能被强制转换Py_ssize_t
为 Cython,因此不能按原样处理。
我的第一个想法是,将功能添加到 Cython 的类型化内存视图不会太难。但这可能不是那么容易以一致的方式完成:操作的结果必须是一个新的类型化内存视图(因为我们无法就地更改手头的数组 - 生成的数组可能具有完全不同的维度) - 但是哪种类型应该是底层缓冲区?在 numpy-world 中更容易,其中所有内容都是 numpy 数组,但类型化内存视图的底层缓冲区可能是 numpy-array、an array.array
、堆栈上的 c-array 等等。
您现在最好的选择可能是手动推出这种重新排序(因此您可以明确选择底层缓冲区的类型)并通过它替换损坏的代码,或者回退到此操作的 numpy 功能,如@DavidWs answer所示.