Cython错误消息:缓冲区的维数错误(预期1,得到2)

我试图在Cython中编码最小二乘估计器用于学习目的。 我有这个基本版本的工作:

import cython
import numpy as np
from scipy.linalg import inv
cimport numpy as np


def ols_c(np.ndarray x, np.ndarray y):
  cdef int nrowx = x.shape[0]
  cdef int ncolx = x.shape[1]
  cdef np.ndarray beta = np.zeros([ncolx,1], dtype=float) 
  cdef np.ndarray a1 = np.zeros([ncolx, ncolx], dtype=float)
  cdef np.ndarray a2 = np.zeros([ncolx, nrowx], dtype=float)
  a1 = inv(np.dot(x.T,x))
  a2 = np.dot(a1,x.T)
  beta = np.dot(a2,y)
  return(beta)

这比这个Numpy版本稍微慢一些:

import numpy as np
from scipy.linalg import inv

def ols(x,y):
  a1 = inv(np.dot(x.T,x))
  a2 = np.dot(a1,x.T)
  beta = np.dot(a2,y)
  return(beta)

我想这可能是由于低效的数组索引。 在互联网上的教程之后,我修改了基本的Cython版本,如下所示:

import cython
import numpy as np
from scipy.linalg import inv
cimport numpy as np
DTYPE = np.float
ctypedef np.float_t DTYPE_t


def ols_c(np.ndarray[DTYPE_t, ndim=2] x, np.ndarray[DTYPE_t, ndim=1] y):
  cdef int nrowx = x.shape[0]
  cdef int ncolx = x.shape[1]
  cdef np.ndarray[DTYPE_t, ndim=1] beta = np.zeros([ncolx,1], dtype=float) 
  cdef np.ndarray[DTYPE_t, ndim=2] a1 = np.zeros([ncolx, ncolx], dtype=float)
  cdef np.ndarray[DTYPE_t, ndim=2] a2 = np.zeros([ncolx, nrowx], dtype=float)
  a1 = inv(np.dot(x.T,x))
  a2 = np.dot(a1,x.T)
  beta = np.dot(a2,y)
  return(beta)

但现在它不起作用,我收到以下错误消息:

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

什么导致这个错误? 我还有其他一些问题:

这两条线实际上做了什么?

DTYPE = np.float
ctypedef np.float_t DTYPE_t

此外,如果我理解正确地输入此cdef np.ndarray [DTYPE_t,ndim = 2] x = np.zeros([ncol,nrow],dtype = float)将创建一个列数等于ncol的二维数组x等于nrow的行,包含浮游物。 但是[DTYPE_t,ndim = 2]实际上做了什么? 我还没有找到任何文件。

预先感谢您的答案!

编辑:看起来像我用双替换DTYPE_t并注释这两行:

DTYPE = np.float
ctypedef np.float_t DTYPE_t

HOwever,执行仍然缓慢。 我能做些什么来加快速度?


关于你的速度看看@ http://simula.no/research/sc/publications/Simula.SC.578/simula_pdf_file:

出于同样的原因,试图对代码进行矢量化也导致性能很差。 矢量化使用切片,而切片是未在Cython中实现的Python对象。

DeVectorizing你的代码可能会加快速度。


这两条线实际上做了什么?

DTYPE = np.float
ctypedef np.float_t DTYPE_t

它将np.float (Python-)类型分配给名为DTYPE的变量并声明C类型定义(ctypedef)。

ctypedef中使用ctypedef关键字将使它在已编译的Cython代码中添加具有给定类型的C / C ++ typedef语句。

typedef ref类型等于它定义的类型,但编译器会在给它一个另一个类型的值时发出警告(即使它是从中定义的类型)。

在使用Cython时,您应该对C或C ++有一点了解。

链接地址: http://www.djcxy.com/p/87921.html

上一篇: Cython error message: Buffer has wrong number of dimensions (expected 1, got 2)

下一篇: Maintaining session across http calls in Android