我正在尝试创建一个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
鉴于我想用该矢量覆盖第一行,因此我不了解...对我做错的任何想法吗?
答案 0 :(得分:1)
您想使用的操作可以在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-arrays(我们知道.base
是一个numpy-array):
results.base[:, 0] = np.random.rand(10)
#check it worked:
print(results.base)
Cython的版本开销较小,但是对于大型矩阵而言,差别不会太大。