标签: cython

如何使用cython创建自定义numpy dtype

有创建用C定制numpy的dtypes例子在这里:

另外,似乎可以在cython中创建自定义ufunc:

似乎也应该可以使用cython创建一个dtype(然后为它创建自定义ufunc).可能吗?如果是这样,你能发一个例子吗?

使用案例:

我想做一些生存分析.基本数据元素是具有相关审查值的生存时间(浮点数)(如果关联时间表示失败时间则为假,如果它代表审查时间则为True(即,在观察期间未发生故障)).

显然,我可以使用两个numpy数组来存储这些值:时间的float数组和censor值的bool数组.但是,我想说明事件发生多次的可能性(这是一个很好的模型,比如心脏病发作 - 你可以拥有多个).在这种情况下,我需要一个对象数组,我称之为MultiEvents.每个都MultiEvent包含一系列浮点数(未经审查的失败时间)和一个观察期(也是一个浮点数).请注意,所有MultiEvents 的故障数量并不相同.

我需要能够在一个MultiEvents 数组上执行一些操作:

  1. 获取每个故障的数量

  2. 获得删失时间(即观察时间减去所有失败时间的总和)

  3. 根据其他参数数组(例如危险值数组)计算对数似然.例如,单个MultiEvent M和持续危险值的对数似然h可能是这样的:

    sum(log(h) + h*t for t in M.times) - h*(M.period - sum(M.times))

M.times失败时间的列表(数组,等等)在哪里,M.period是总观察期.我希望适用适当的numpy广播规则,以便我能做到:

log_lik = logp(M_vec,h_vec)
Run Code Online (Sandbox Code Playgroud)

只要尺寸M_vech_vec兼容性,它就能工作.

我当前的实现使用numpy.vectorize.这工作得很好1和2,但实在是太慢了3.另请注意,我不能做这个,因为失败的我多数据对象数量不提前知道.

python numpy cython

24
推荐指数
1
解决办法
1934
查看次数

使用BLAS实现更快的python内部产品

我发现这个有用的教程是关于使用低级BLAS函数(在Cython中实现)来获得比python中标准的numpy线性代数例程更快的速度.现在,我已成功地使矢量产品正常工作.首先,我保存以下内容linalg.pyx:

import cython
import numpy as np
cimport numpy as np

from libc.math cimport exp
from libc.string cimport memset

from scipy.linalg.blas import fblas

REAL = np.float64
ctypedef np.float64_t REAL_t

cdef extern from "/home/jlorince/flda/voidptr.h":
    void* PyCObject_AsVoidPtr(object obj)

ctypedef double (*ddot_ptr) (const int *N, const double *X, const int *incX, const double *Y, const int *incY) nogil
cdef ddot_ptr ddot=<ddot_ptr>PyCObject_AsVoidPtr(fblas.ddot._cpointer)  # vector-vector multiplication 

cdef int ONE = 1
def vec_vec(syn0, syn1, size):
    cdef int lSize = …
Run Code Online (Sandbox Code Playgroud)

python numpy linear-algebra cython blas

24
推荐指数
1
解决办法
1098
查看次数

什么是pyximport,我应该如何使用它?

我正在使用cython为数学模型生成更快的代码.我很难编译代码,但不知怎的,我设法使用.bat:

setlocal EnableDelayedExpansion

CALL "C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\SetEnv.cmd" /x64 /release
set DISTUTILS_USE_SDK=1

C:\Python27\python.exe C:\gcsilve\trunk\myproject\myproject\cythonsetup.py build_ext --inplace

PAUSE
Run Code Online (Sandbox Code Playgroud)

它运行正常......

我的问题是关于pyximport.我有使用pyximport.install()的其他人编写的旧代码.我无法弄清楚它的作用以及为什么我应该使用它,因为我已经自己编译了代码.那么,有人可以用一个非常简单的(对于傻瓜)的方式向我解释pyximport的作用吗?

附加信息:我有一个project1,使用cython.我有一个project2,它引用了project1.

python pydev cython python-2.7

23
推荐指数
2
解决办法
2万
查看次数

运行python setup.py install时强制编译

有没有办法在运行时显式强制编译器构建Cython扩展python setup.py installsetup.py形式在哪里:

import os.path
import numpy as np
from setuptools import setup, find_packages, Extension
from Cython.Distutils import build_ext

setup(name='test',
  packages=find_packages(),
  cmdclass={'build_ext': build_ext},
  ext_modules = [ Extension("test.func", ["test/func.pyx"]) ],
  include_dirs=[np.get_include()]
 )
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Anaconda 3.16,Python 3.4,setuptools 18,Numpy 1.9和Cython 0.24在Windows 8.1 x64上安装软件包.部署脚本改编自用Cython 维基这个 堆栈溢出的答案.

Makefile.bat

:: create and activate a virtual environement with conda
conda create --yes -n test_env cython setuptools=18 pywin32 libpython numpy=1.9 python=3
call activate test_env

:: activate the MS SDK compiler as explained in …
Run Code Online (Sandbox Code Playgroud)

python setuptools cython anaconda

23
推荐指数
1
解决办法
3585
查看次数

使用Cython进行setup_requires?

我正在setup.py为一个带有一些Cython扩展模块的项目创建一个文件.

我已经让这个工作了:

from setuptools import setup, Extension
from Cython.Build import cythonize

setup(
    name=...,
    ...,
    ext_modules=cythonize([ ... ]),
)
Run Code Online (Sandbox Code Playgroud)

安装很好.但是,这假设已安装Cython.如果没有安装怎么办?我知道这是setup_requires参数的用途:

from setuptools import setup, Extension
from Cython.Build import cythonize

setup(
    name=...,
    ...,
    setup_requires=['Cython'],
    ...,
    ext_modules=cythonize([ ... ]),
)
Run Code Online (Sandbox Code Playgroud)

但是,如果尚未安装Cython,这当然会失败:

$ python setup.py install
Traceback (most recent call last):
  File "setup.py", line 2, in <module>
    from Cython.Build import cythonize
ImportError: No module named Cython.Build
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?我Cythonsetup_requires需要Cython在步骤运行后以某种方式导入,但我需要为了指定ext_modules值.

python software-distribution build setuptools cython

23
推荐指数
2
解决办法
7735
查看次数

用于将cython中的许多c ++类包装到单个共享对象的项目结构

我在这里找到了文档,邮件列表和这个问题之间的部分答案,但我希望得到更直接的答案来解决我的具体问题......

我正在学习cython,试图一点一点地包装我已经使用的库,当前包含在boost :: python中的库.我为这个boost包装器贡献了一点点,并将它用作c ++参考,同时我使用ZeroMQ Python绑定作为cython参考.

我的问题是关于项目结构.这个lib的当前boost版本编译为单个.so,这是我的目标.我很快发现你不能直接将多个.pyx模块编译成一个.so.然后我开始沿着定义文件中的cppclass's' pxd及其相应的python导出的实现类的路径.pxi,并试图将它们包含在单个文件中pyx进行编译.虽然它最初起作用,但是一旦我写了一点,我就会因为pxi包含在不同的地方而遇到多个定义冲突的问题.

我很想听到一个适当的组织方法来解决以下问题和目标:

  • 将公共类命名为cppclass(我现在通过将cppclass放在不同的命名中pyd并使用导入的命名空间来处理类似的名称,ala 使用cimport来解决命名冲突)
  • 单个.so作为编译输出(可接受的方法?)
  • 单独使用pyx多包含方法进入主要方法pyx,还是主要pyx包含除了包含包含之外的其他内容?
  • 在哪里集中定义将在python中导出的常量?
  • 是否有首选的文件夹结构?现在我把所有东西src放在我的下面一个大目录中setup.py.看到这么多pxi, pxd, pyx文件会让人感到困惑.
  • pxi现在完全没有必要?如果没有,我是否需要使用cython风格的ifndef防护来处理不同模块之间的多个包含?
  • 我知道ZeroMQ python绑定构建了多个模块,并通过包含它们来使用包方法__init__.py.这真的是cython的正确方法吗?

作为参考,我正在练习重新包装的项目是PyOpenNI(openni).此boost项目采用的模式是在一个地方收集公共对象,然后使用源定义一对一的头定义,然后有一个巨大的包装器将所有定义收集到单个位置.还有添加的自定义异常处理和实用程序.

c++ python design-patterns cython

22
推荐指数
1
解决办法
4226
查看次数

如何使用pyximport以交互方式重新加载cython模块

在编写python代码时,我的典型工作流程是使用交互式提示并执行类似的操作

write function
repeat until working:
  test function
  edit function
Run Code Online (Sandbox Code Playgroud)

一旦我确定一切正常,我将以非交互模式运行代码并收集结果.

有时功能运行有点太慢,必须进行优化.

我对使用cython优化这些慢速函数感兴趣,但我希望保持我的交互式工作流程,即运行函数,进行更改,再次运行它们.

是否有捷径可寻?

到目前为止,我已经尝试将我的cython函数放在一个单独的模块"my_functions.pyx"中:

def fun1(int x):
    return x + 130

def fun2(int x):
    return x / 30
Run Code Online (Sandbox Code Playgroud)

然后运行(在交互式提示下)

import pyximport; pyximport.install()
import my_functions as mf
mf.fun1(25)
Run Code Online (Sandbox Code Playgroud)

这是第一次工作,但我想对我的cython函数进行更改并在同一个交互式会话中重新加载它们.

赛跑

import my_functions as mf
Run Code Online (Sandbox Code Playgroud)

根本不更新功能.跑步

reload(mf)
Run Code Online (Sandbox Code Playgroud)

给出错误:没有名为my_functions的模块

唯一有效的方法是退出当前会话,重新启动ipython,然后重新导入模块.但这种方式会破坏交互式运行的好处.

有没有更好的方法来交互式地优化cython的功能?

如果没有,你能描述一些其他方法来使用cython来优化代码吗?

任何帮助表示赞赏.

python optimization cython

22
推荐指数
1
解决办法
3563
查看次数

Python/Cython中的快速n维稀疏数组

我有一个涉及非常稀疏的大型n维数组的应用程序.scipy.sparse有一个有用的'矢量化获取和设置'功能,因此可以使用Cython快速填充稀疏矩阵.

当然,scipy包不能处理n维.我发现有两个包在python sparray和.d中进行n维稀疏数组ndsparse.然而,它似乎既没有矢量化的获取和设置功能.

所以我需要:

  • 带有矢量化get和set或的n维数组的python包
  • 用于稀疏数组的ac库,我可以使用Cython或
  • 一些'滚动你自己'选项,我想这将需要交替相当于一个python dict

为了我的目的,我认为将n维坐标映射回1或2维可能有效.更好的是有一个dict等价物,我可以在Cython循环内快速访问.我认为这排除了python dict.

想知道是否有人可以给我一个如何在Cython中使用c ++地图对象的例子?

python sparse-array cython sparse-matrix

22
推荐指数
1
解决办法
1718
查看次数

Cython:类型化内存视图是键入numpy数组的现代方法吗?

假设我想将一个numpy数组传递给一个cdef函数:

cdef double mysum(double[:] arr):
    cdef int n = len(arr)
    cdef double result = 0

    for i in range(n):
        result = result + arr[i]

    return result
Run Code Online (Sandbox Code Playgroud)

这是处理键入numpy数组的现代方法吗?与这个问题相比:cython/numpy类型的数组

如果我想执行以下操作该怎么办?

cdef double[:] mydifference(int a, int b):
    cdef double[:] arr_a = np.arange(a)
    cdef double[:] arr_b = np.arange(b)

    return arr_a - arr_b
Run Code Online (Sandbox Code Playgroud)

这将返回错误,因为-没有为memoryviews定义.那么,该案件是否应如下处理?

cdef double[:] mydifference(int a, int b):
    arr_a = np.arange(a)
    arr_b = np.arange(b)

    return arr_a - arr_b
Run Code Online (Sandbox Code Playgroud)

python numpy cython

22
推荐指数
1
解决办法
6714
查看次数

指定cython输出文件

似乎默认设置来自distutils.core并将cmdclass设置为build_ext,在当前工作目录中编译cpp或c文件.有没有办法确定生成的c代码写入的位置?否则,存储库将充满生成的代码.

例如,此文件setup.py将文件example.c写入当前工作目录:

from distutils.core import setup
from Cython.Build import cythonize

setup(
      ext_modules = cythonize("example.pyx"))
Run Code Online (Sandbox Code Playgroud)

c++ python cython

22
推荐指数
3
解决办法
5316
查看次数