Cython 内存视图形状不正确?

Cython memoryview shape incorrect?

考虑以下内容以创建大小为 4 的线性数组:

import numpy as np
cimport numpy as np
cdef np.float64_t [:] a = np.zeros(shape=(4),dtype=np.float64)

a.shape应该是(4,)。然而:

print(a.shape)
>>> [4, 0, 0, 0, 0, 0, 0, 0]

这是怎么回事?原Python代码给出正确答案:

a = np.zeros(shape=(4),dtype=np.float64)
print(a.shape)
>>> (4,)

它们在功能上是相同的。内存视图将形状存储在长度为 8 的静态分配数组中(通常 - 如果需要,可以配置最大维数)。

这样做的好处是可以直接从 Cython 访问数组,没有间接访问也没有分配,因为它只是一个 C 数组。缺点是它给出了一个稍微令人惊讶的输出。

ndim 以上的所有维度与其行为方式无关。