【问题标题】:Memoryviews slices in Cython ask for a scalarCython 中的 Memoryviews 切片要求标量
【发布时间】:2019-11-29 13:02:38
【问题描述】:

我正在尝试创建一个内存视图来将多个向量存储为行,但是当我尝试更改任何向量的值时,我得到了一个错误,就像它需要一个标量一样。

%%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

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

【问题讨论】:

    标签: cython memoryview


    【解决方案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 的版本开销较小,但对于大型矩阵不会有太大差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 2019-05-13
      • 1970-01-01
      • 2017-11-27
      相关资源
      最近更新 更多