无法在cython中为numpy数组赋值

iyfjxgzm  于 2022-12-18  发布在  其他
关注(0)|答案(1)|浏览(131)

我对cython中的并行编程相当陌生,我试图从numpy创建一个大小为3的1D数组,但是我不能给这个数组赋值,除非我逐个元素地指定它。

import numpy as np
    cimport numpy as cnp

    cdef int num = 3
    cdef cnp.ndarray[cnp.int_t, ndim = 1] Weight = np.ones((num), dtype = "int")
    Weight[2] = 6
    print(Weight)

产量-〉[1 1 6]

Weight = cnp.ndarray([1,2,3])

输出-〉值错误:缓冲区的维数错误(应为1,实际为3)

0yg35tkg

0yg35tkg1#

在评论中我建议修改:

Weight = cnp.ndarray([1,2,3])

Weight = np.array([1,2,3])

只是为了澄清我的评论多一点:
这条线

cdef cnp.ndarray[cnp.int_t, ndim = 1] Weight = np.ones((num), dtype = "int")


实际上是两部分:

  1. cdef cnp.ndarray[cnp.int_t, ndim = 1] Weight
    这没有分配内存,它只是创建了一个可以引用numpy数组的变量,并且允许快速索引。
  2. Weight = np.ones((num), dtype = "int")
    这是对np.ones的一个普通的 Python 调用,它为数组分配内存。它在很大程度上没有被Cython加速。从这一点开始,Weight是对那个分配的数组的引用,并且可以用来改变它。注意下面几行中的Weight = ...将改变Weight引用的数组。
    因此,我建议您跳过np.ones步骤,直接
cdef cnp.ndarray[cnp.int_t, ndim = 1] Weight = np.ones([1,2,3], dtype = "int")

要知道,使用这些声明唯一能加快Numpy对数组的索引,几乎所有其他的Numpy调用都是通过普通Python机制进行的,需要GIL,并且以普通Python的速度进行。

相关问题