我正在尝试使用点积,矩阵求逆和其他基本线性代数运算,这些运算可以从Cython中获得.函数如numpy.linalg.inv(反转),numpy.dot(点积),X.t(矩阵/数组的转置).numpy.*从Cython函数调用有很大的开销,其余的函数是用Cython编写的,所以我想避免这种情况.
如果我假设用户已numpy安装,有没有办法做类似的事情:
#include "numpy/npy_math.h"
Run Code Online (Sandbox Code Playgroud)
作为一个extern,并调用这些功能?或者直接调用BLAS(或者numpy调用这些核心操作的任何东西)?
举一个例子,想象一下你在Cython中有一个函数做很多事情,最后需要进行涉及点积和矩阵求逆的计算:
cdef myfunc(...):
# ... do many things faster than Python could
# ...
# compute one value using dot products and inv
# without using
# import numpy as np
# np.*
val = gammaln(sum(v)) - sum(gammaln(v)) + dot((v - 1).T, log(x).T)
Run Code Online (Sandbox Code Playgroud)
如何才能做到这一点?如果有一个库已经在Cython中实现了这些,我也可以使用它,但没有找到任何东西.即使这些程序没有直接优化BLAS,没有numpy从Cython 调用Python模块的开销仍然会使整体事情变得更快.
我要调用的示例函数:
np.dot)np.linalg.inv)x.Tnumpy)scipy.gammaln等效,应该在C中可用)我在numpy邮件列表(https://groups.google.com/forum/?fromgroups=#!topic/cython-users/XZjMVSIQnTE …
我正在尝试dgtsv使用Cython 包装LAPACK函数(三对角方程组的求解器).
我遇到了这个前面的答案,但由于dgtsv不是LAPACK功能之一,scipy.linalg我不认为我可以使用这种特殊的方法.相反,我一直试图遵循这个例子.
这是我的lapacke.pxd文件的内容:
ctypedef int lapack_int
cdef extern from "lapacke.h" nogil:
int LAPACK_ROW_MAJOR
int LAPACK_COL_MAJOR
lapack_int LAPACKE_dgtsv(int matrix_order,
lapack_int n,
lapack_int nrhs,
double * dl,
double * d,
double * du,
double * b,
lapack_int ldb)
Run Code Online (Sandbox Code Playgroud)
...这是我的瘦Cython包装_solvers.pyx:
#!python
cimport cython
from lapacke cimport *
cpdef TDMA_lapacke(double[::1] DL, double[::1] D, double[::1] DU,
double[:, ::1] B):
cdef:
lapack_int n = D.shape[0]
lapack_int nrhs = B.shape[1]
lapack_int ldb …Run Code Online (Sandbox Code Playgroud)