小编nic*_*ell的帖子

python数学模块中的log2

为什么不存在?

import math
[x for x in dir(math) if 'log' in x]
>>> ['log', 'log10', 'log1p']
Run Code Online (Sandbox Code Playgroud)

我知道我可以做log(x,2),但是log2很常见,所以我有点困惑.

哦,看起来它只在C99中定义,而不是C90,我猜这回答了我的问题.仍然看起来有点傻.

python math

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

Python:使用ctypes的垃圾收集器行为

所以让我们说IC/C++代码分配一些内存,并返回一个指向它的指针.

#include <stdlib.h>

#ifdef __cplusplus
  extern "C" {
#endif

void Allocate(void **p) {
 int N=2048;
 *p=malloc(N);
}

#ifdef __cplusplus
 }
#endif
Run Code Online (Sandbox Code Playgroud)

我明白,释放这块内存是我的责任.现在假设我将其编译成共享库并使用ctypes从Python调用它,但是没有显式释放该内存.

import ctypes
from ctypes import cdll, Structure, byref
external_lib = cdll.LoadLibrary('libtest.so.1.0')
ptr=ctypes.c_void_p(0)
external_lib.Allocate(ctypes.byref(ptr))
Run Code Online (Sandbox Code Playgroud)

如果我用valgrind运行这个脚本,如果我编译test.cpp没有'-O3'标志,我会得到2048字节的内存泄漏.但是如果我使用'-O3'标志编译它,那么我不会得到内存泄漏.

这不是一个真正的问题 - 我会小心翼翼地明确释放我分配的任何内存.但我很好奇这种行为来自哪里.

我在linux中用以下脚本测试了这个.

g++ -Wall -c -fPIC -fno-common test.cpp -o libtest1.o
g++ -shared -Wl,-soname,libtest1.so.1 -o libtest1.so.1.0  libtest1.o

g++ -O3 -Wall -c -fPIC -fno-common test.cpp -o libtest2.o
g++ -shared -Wl,-soname,libtest2.so.1 -o libtest2.so.1.0  libtest2.o

valgrind python test1.py &> report1
valgrind python test2.py &> report2
Run Code Online (Sandbox Code Playgroud)

具有以下输出 …

python garbage-collection ctypes

16
推荐指数
1
解决办法
1160
查看次数

计算生成器的python中的平均值

我正在做一些统计工作,我有一个(大)随机数集合来计算平均值,我想使用生成器,因为我只需要计算均值,所以我不需要存储数字.

问题是numpy.mean如果你把它传给发电机就会中断.我可以写一个简单的函数来做我想要的,但我想知道是否有一个正确的,内置的方法来做到这一点?

如果我能说"sum(values)/ len(values)"会很好,但是len不适用于genetators,并且总和已经消耗的值.

这是一个例子:

import numpy 

def my_mean(values):
    n = 0
    Sum = 0.0
    try:
        while True:
            Sum += next(values)
            n += 1
    except StopIteration: pass
    return float(Sum)/n

X = [k for k in range(1,7)]
Y = (k for k in range(1,7))

print numpy.mean(X)
print my_mean(Y)
Run Code Online (Sandbox Code Playgroud)

这两个都给出相同,正确,答案,买my_mean不适用于列表,numpy.mean不适用于生成器.

我真的很喜欢使用发电机的想法,但这样的细节似乎破坏了事情.

python generator mean

13
推荐指数
3
解决办法
6810
查看次数

增加功能

所以一般来说,如果你有两个函数f,g:X - > Y,并且如果在Y上定义了一些二元运算+,那么f + g的规范定义为函数x - > f(x)+ G(X).

在Mathematica中实现这个的最佳方法是什么?

f[x_] := x^2
g[x_] := 2*x
h = f + g;
h[1]
Run Code Online (Sandbox Code Playgroud)

产量

(f + g)[1]
Run Code Online (Sandbox Code Playgroud)

作为输出

当然,

H = Function[z, f[z] + g[z]];
H[1]
Run Code Online (Sandbox Code Playgroud)

收益率为3.

wolfram-mathematica

11
推荐指数
2
解决办法
1818
查看次数

std :: function <>和Intel编译器版本11.1

我在使用英特尔编译器中的lambda函数时遇到问题,特别是以下代码无法编译:

template<typename T>
std::function<T (int)>  make_func(T x) {
  return [=](int index) -> T
  {
     return x;
  };
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

error: namespace "std" has no member "function"
Run Code Online (Sandbox Code Playgroud)

代码在我的Mac上编译并运行良好,(macports gcc version 4.5).错误在起作用,我们使用英特尔编译器版本11.1.它接受lambda函数(使用-std = c ++ 0x选项),例如:

auto lam = [=](int j) -> int {
    printf("testing for lambdas: %d\t%d\n", n, j);
    return n;
};

int g = lam(7);
Run Code Online (Sandbox Code Playgroud)

工作中安装的gcc版本是4.1.2,所以我猜测标准库已经老了?

/bin/libc.so.6
Run Code Online (Sandbox Code Playgroud)

说这是用gcc 4.1.2编译的2.5版本.

有没有解决的办法?

提前感谢您的帮助

c++ lambda intel

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

scons:多个文件作为目标

我有一个脚本,让我们说"foo.py",这取决于一些文件,让我们说"dep.par",我会称之为

python foo.py --parameters=dep.par
Run Code Online (Sandbox Code Playgroud)

如果foo.py只写一个输出文件"bar.dat",我会说:

env=Environment()
env.Command("bar.dat", "dep.par", "python foo.py --parameters=dep.par")
Run Code Online (Sandbox Code Playgroud)

但是,我需要foo.py输出多个文件的情况,让我们说"bar1.dat,bar2.dat,...,barN.dat".

我很茫然,任何帮助都会受到赞赏,谢谢.

scons

4
推荐指数
1
解决办法
2014
查看次数

涓滴单位测试

如果我在C中编写一个包含Python接口的库,那么在Python接口中编写函数的单元测试是否可以?假设Python接口完整,它应该意味着C代码工作.

大多数情况下,我很懒,因为Python单元测试的东西几乎不需要使用.

谢谢, - 快

c python unit-testing

3
推荐指数
1
解决办法
208
查看次数

python/numpy中的线性组合

问候,

我不确定这是不是一个愚蠢的问题.

假设我有3个numpy数组,A1,A2,A3和3个浮点数,c1,c2,c3

我想评估B = A1*c1 + A2*c2 + A3*c3

numpy计算这个例如,

 E1 = A1*c1
 E2 = A2*c2
 E3 = A3*c3
 D1 = E1+E2
 B = D1+E3
Run Code Online (Sandbox Code Playgroud)

还是比这更聪明?在c ++中,我有一种巧妙的方法来抽象这种操作.

我定义了一系列通用'LC'模板函数,LC用于线性组合,如:

template<class T,class D>
void LC( T & R,
    T & L0,D C0,
    T & L1,D C1,
    T & L2,D C2)
{
    R = L0*C0
        +L1*C1
        +L2*C2;        
}
Run Code Online (Sandbox Code Playgroud)

然后将其专门用于各种类型,

例如,对于数组代码看起来像

for (int i=0; i<L0.length; i++)
    R.array[i] =
    L0.array[i]*C0 +
    L1.array[i]*C1 +
    L2.array[i]*C2;
Run Code Online (Sandbox Code Playgroud)

从而避免必须创建新的中间阵列.

这可能看起来很乱,但效果确实很好.

我可以在python中做类似的事情,但我不确定它是否是必需的.

提前感谢您的任何见解.-缺口

python arrays numpy linear-algebra

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

在python; 将文件列表转换为像对象一样的文件

呃,所以我正在处理解析器等等,而且我将从一个处理文件的东西转到另一个.

我的代码的第一部分的输出是一个字符串列表; 我正在考虑将每个字符串作为文本文件中的一行.

代码的第二部分需要一个文件类型作为输入.

所以我的问题是,是否有一种正确的,pythonic的方式将字符串列表转换为像对象一样的文件?

我可以将我的字符串列表写入文件,然后重新打开该文件,它可以正常工作,但如果没有必要,写入磁盘似乎有点傻.

我相信所有第二部分需要的是在文件上调用'read()',就像对象一样,所以我也可以用read作为方法定义一个新类,它返回一个长字符串,这是所有字符串的串联线串.

谢谢, - 快

python text

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