小编oce*_*hug的帖子

如何以编程方式设置文档字符串?

我有一个返回函数的包装函数.有没有办法以编程方式设置返回函数的docstring?如果我可以写信,__doc__我会做以下事情:

def wrapper(a):
    def add_something(b):
       return a + b
    add_something.__doc__ = 'Adds ' + str(a) + ' to `b`'
    return add_something
Run Code Online (Sandbox Code Playgroud)

然后我就能做到

>>> add_three = wrapper(3)
>>> add_three.__doc__
'Adds 3 to `b`
Run Code Online (Sandbox Code Playgroud)

但是,由于__doc__是只读的,我不能这样做.什么是正确的方法?


编辑:好的,我想保持这个简单,但当然这不是我真正想要做的.虽然一般来说__doc__在我的情况下是可写的但事实并非如此.

我正在尝试unittest自动创建测试用例.我有一个包装函数,它创建一个类对象,它是以下的子类unittest.TestCase:

import unittest
def makeTestCase(filename, my_func):
    class ATest(unittest.TestCase):
        def testSomething(self):
            # Running test in here with data in filename and function my_func
            data  = loadmat(filename)
            result = my_func(data)
            self.assertTrue(result > 0)

    return ATest
Run Code Online (Sandbox Code Playgroud)

如果我创建这个类并尝试设置docstring testSomething我得到一个错误: …

python docstring

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

logs中的logsumexp实现?

有没有人知道提供logsumexp-function的开源数值C库?

logsumexp(a)函数计算数组a的分量的指数log(e ^ {a_1} + ... e ^ {a_n})的总和,避免数值溢出.

c numerical

11
推荐指数
1
解决办法
1859
查看次数

如何在使用C扩展numpy时考虑列连续数组

我有一个C函数来规范化日志空间中的数组行(这可以防止数字下溢).

我的C函数的原型如下:

void normalize_logspace_matrix(size_t nrow, size_t ncol, double* mat);
Run Code Online (Sandbox Code Playgroud)

你可以看到它需要一个指向数组的指针并在适当的位置修改它.C代码当然假设数据被保存为C连续数组,即行连续.

我使用Cython(导入并cdef extern from省略)将函数包装如下:

def normalize_logspace(np.ndarray[np.double_t, ndim=2] mat):
    cdef Py_ssize_t n, d
    n = mat.shape[0]
    d = mat.shape[1]
    normalize_logspace_matrix(n, d, <double*> mat.data)
    return mat
Run Code Online (Sandbox Code Playgroud)

大多数情况下,numpy-arrays是行连续的,函数运行正常.但是,如果先前已转换了numpy-array,则不会复制数据,而只返回数据的新视图.在这种情况下,我的函数失败,因为数组不再是行连续的.

我可以通过将数组定义为具有Fortran连续顺序来解决这个问题,这样在转置后它将是C连续的:

A = np.array([some_func(d) for d in range(D)], order='F').T
A = normalize_logspace(A)
Run Code Online (Sandbox Code Playgroud)

显然,这非常容易出错,用户必须注意数组的顺序是正确的,这是用户在Python中不需要关心的.

使用行和列连续数组的最佳方法是什么?我假设在Cython中进行某种数组顺序检查是可行的方法.当然,我更喜欢不需要将数据复制到新数组的解决方案,但我几乎认为这是必要的.

c python numpy cython

10
推荐指数
1
解决办法
1781
查看次数

在Celery中获取工作者ID

我想使用Celery在带有四张Tesla卡的GPU服务器上运行作业.我用一个由四名工人组成的工作人员来管理芹菜工人,这样每张卡片总能运行一份工作.

我的问题是如何指导工人每个声称一个GPU.目前,我依赖于工作进程应该都具有连续进程ID的假设:

device_id = os.getpid() % self.ndevices
Run Code Online (Sandbox Code Playgroud)

但是,我不能保证始终可以工作,即当工作进程随着时间的推移重新启动时.理想情况下,我想直接获得每个工人的ID.有人可以告诉我是否可以从任务中检查工作人员,或者可以建议不同的解决方案来跨GPU分配工作?

python celery

9
推荐指数
1
解决办法
5321
查看次数

我应该用我的Python应用程序捆绑C库吗?

如果我有一个依赖于某些C库的Python包(比如用于数值计算的Gnu Scientific Library(GSL)),那么将库与我的代码捆绑在一起是一个好主意吗?

我想让我的软件包尽可能易于安装,并且我不希望他们必须手动下载C库并提供包含路径.此外,我始终可以确保我发布的库版本与我的代码兼容.

但是,如果用户已经安装了库,是否可能存在冲突,或者是否有任何其他原因导致我不应该这样做?

我知道我可以通过提供二进制分发使用户更容易,但我想避免为所有可能的操作系统维护二进制分发.所以,我想坚持使用源代码,但对于用户(自豪地拥有C编译器),安装应该如此简单python setup.py install.

c python distutils

7
推荐指数
2
解决办法
477
查看次数

使用wxPython清除matplotlib中的背景

我想用matplotlib创建一个动画来监视聚类算法的收敛.它应该在第一次调用时绘制我的数据的散点图,并在每次更新绘图时绘制误差椭圆.我正在尝试使用canvas_copy_from_bbox()restore_region()保存散点图,然后在我更新绘图时绘制一组新的省略号.但是,代码只是将旧椭圆绘制在旧椭圆之上,而不先清除先前的绘图.我怀疑,不知何故,这种方法Ellipse()add_path()命令不兼容,但我不知道如何解决这个问题.

这是代码:

import wx
import math 
from math import pi
from matplotlib.patches import Ellipse
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import \
     FigureCanvasWxAgg as FigureCanvas

TIMER_ID = wx.NewId()


class _MonitorPlot(wx.Frame):
    def __init__(self, data, scale=1):
        self.scale = scale
        wx.Frame.__init__(self, None, wx.ID_ANY,
                          title="FlowVB Progress Monitor", size=(800, 600))
        self.fig = Figure((8, 6), 100)
        self.canvas = FigureCanvas(self, wx.ID_ANY, self.fig)
        self.ax = self.fig.add_subplot(111)

        x_lims = [data[:, 0].min(), data[:, 0].max()]
        y_lims = [data[:, 1].min(), data[:, 1].max()]

        self.ax.set_xlim(x_lims)
        self.ax.set_ylim(y_lims) …
Run Code Online (Sandbox Code Playgroud)

python wxpython matplotlib

6
推荐指数
1
解决办法
1990
查看次数

在列表理解中省略迭代器?

是否有更优雅的方式来编写以下Python?

[foo() for i in range(10)]
Run Code Online (Sandbox Code Playgroud)

我想在列表中累积foo()的结果,但我不需要迭代器i.

python list-comprehension

5
推荐指数
1
解决办法
289
查看次数

使用C函数扩展Numpy

我正在尝试加速我的Numpy代码,并决定我想实现一个特定的函数,我的代码大部分时间都在C中.

我实际上是C中的新手,但我设法编写了一个函数,它将矩阵中的每一行规范化为1.我可以编译它并用一些数据(在C中)测试它并且它做我想要的.那时我为自己感到骄傲.

现在我试图从Python中调用我的光荣函数,它应该接受一个2d-Numpy数组.

我尝试过的各种事情都是

  • 痛饮

  • SWIG + numpy.i

  • ctypes的

我的功能有原型

void normalize_logspace_matrix(size_t nrow, size_t ncol, double mat[nrow][ncol]);
Run Code Online (Sandbox Code Playgroud)

因此它需要一个指向可变长度数组的指针并将其修改到位.

我尝试了以下纯SWIG接口文件:

%module c_utils

%{
extern void normalize_logspace_matrix(size_t, size_t, double mat[*][*]);
%}

extern void normalize_logspace_matrix(size_t, size_t, double** mat);
Run Code Online (Sandbox Code Playgroud)

然后我会做(在Mac OS X 64bit上):

> swig -python c-utils.i

> gcc -fPIC c-utils_wrap.c -o c-utils_wrap.o \
     -I/Library/Frameworks/Python.framework/Versions/6.2/include/python2.6/ \
     -L/Library/Frameworks/Python.framework/Versions/6.2/lib/python2.6/ -c
c-utils_wrap.c: In function ‘_wrap_normalize_logspace_matrix’:
c-utils_wrap.c:2867: warning: passing argument 3 of ‘normalize_logspace_matrix’ from   incompatible pointer type

> g++ -dynamiclib c-utils.o -o _c_utils.so
Run Code Online (Sandbox Code Playgroud)

在Python中,我在导入模块时遇到以下错误:

>>> import c_utils
Traceback …
Run Code Online (Sandbox Code Playgroud)

c python swig numpy cython

2
推荐指数
1
解决办法
3270
查看次数