Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Cython缓冲协议示例错误_Python_C++_Cython - Fatal编程技术网

Python Cython缓冲协议示例错误

Python Cython缓冲协议示例错误,python,c++,cython,Python,C++,Cython,我正在这个url上尝试这个例子 为了测试它,我执行以下操作 import pyximport pyximport.install(build_dir = 'build') import ctest m = ctest.Matrix(10) m.add_row() print(m) 当我调用m.add_row()函数时,会出现一个错误 TypeError:“int”对象不可编辑 在类中,add_行定义为 from cpython cimport Py_buffer from libcpp.ve

我正在这个url上尝试这个例子

为了测试它,我执行以下操作

import pyximport
pyximport.install(build_dir = 'build')
import ctest

m = ctest.Matrix(10)
m.add_row()
print(m)
当我调用m.add_row()函数时,会出现一个错误
TypeError:“int”对象不可编辑

在类中,add_行定义为

from cpython cimport Py_buffer
from libcpp.vector cimport vector

cdef class Matrix:
    cdef Py_ssize_t ncols
    cdef Py_ssize_t shape[2]
    cdef Py_ssize_t strides[2]
    cdef vector[float] v

    def __cinit__(self, Py_ssize_t ncols):
        self.ncols = ncols

    def add_row(self):
        """Adds a row, initially zero-filled."""
        self.v.extend(self.ncols)
    ...
假设在cython中对向量调用extend与在python列表中调用extend做的事情完全相同,那么这个错误对我来说是完全有意义的。您传递的不是一个数字,而是一个附加到列表中的iterable对象

我可以通过这样做来修复它

def add_row(self):
    """Adds a row, initially zero-filled."""
    self.v.extend([0] * self.ncols)
我只是想知道示例中是否有输入错误,或者我是否遗漏了什么。另外,向量的extend函数从何而来?在Cython分发的VC.T.PXD文件中,它从不导入扩展函数,甚至不存在于C++标准库中。cython对向量类型有什么特殊的作用吗


cpp
向量可以自动转换为python列表。通过检查行
self.v.extend([0]*self.ncols)
,创建了一个新的python列表:
\upyx\ut\u2=PyList\unew(1*((\upyx\uv\uself->ncolsncols))
。因此
extend
实际上是python列表的
extend
方法

这种自动转换也可以通过以下代码进行验证(在jupyter笔记本中):

此外,c数组还可以自动转换为python列表:

%%cython

def test_c_array_to_pylist():
    cdef int i
    cdef int[10] ca
    for i in range(10):
        ca[i] = i
    return ca

a = test_c_array_to_pylist()
print a       # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print type(a) # <type 'list'>
%%cython
def test_c_array_to_pylist():
cdef int i
cdef int[10]ca
对于范围(10)内的i:
ca[i]=i
返回ca
a=测试\u c\u数组\u到\u pylist()
打印a#[0,1,2,3,4,5,6,7,8,9]
打印类型(a)#

值得一提的是,列表不会转换回向量,因此向量最终不会被扩展。没错,请添加另一个代码段来显示这一点。
%%cython -+
from libcpp.vector cimport vector

def test_cpp_vector_to_pylist_1():
    cdef vector[int] cv
    for i in range(10):
        cv.append(i)    # Note: the append method of python list 
    return cv

a = test_cpp_vector_to_pylist_1()
print a       # []
print type(a) # <type 'list'>
%%cython

def test_c_array_to_pylist():
    cdef int i
    cdef int[10] ca
    for i in range(10):
        ca[i] = i
    return ca

a = test_c_array_to_pylist()
print a       # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print type(a) # <type 'list'>