Cython 中的 Memoryviews 切片要求标量

Memoryviews slices in Cython ask for a scalar

我正在尝试创建一个 memoryview 以将多个向量存储为行,但是当我尝试更改任何向量的值时出现错误,就像它期待一个标量一样。

%%cython
import numpy as np
cimport numpy as np

DTYPE = np.float
ctypedef np.float_t DTYPE_t
cdef DTYPE_t[:, ::1] results = np.zeros(shape=(10, 10), dtype=DTYPE)

results[:, 0] = np.random.rand(10)

这给我带来了以下错误:

TypeError: only size-1 arrays can be converted to Python scalars

鉴于我想用该向量覆盖第一行,我不明白...知道我做错了什么吗?

您想要使用的操作可以在 numpy 数组(Python 功能)或 Cython 的内存视图(C 功能,即 Cython 在 C 代码中生成正确的 for 循环)之间使用,但不是你混合了一个内存视图(在左侧)和一个 numpy 数组(在右侧)。

所以你要么使用 Cython 的内存视图:

...
cdef DTYPE_t[::1] r = np.random.rand(10)
results[:, 0] = r
#check it worked:
print(results.base)
...

或numpy数组(我们知道.base是一个numpy数组):

results.base[:, 0] = np.random.rand(10)
#check it worked:
print(results.base)

Cython 的版本开销较小,但对于大型矩阵不会有太大差异。