小编roc*_*ker的帖子

从功能中获取相应的模块

我想修改模块xyz及其功能:

def modify(fun):
    modulename = fun.__module__ # this is string. ok, but not enough

import xyz
modify(xzy.test)
Run Code Online (Sandbox Code Playgroud)

我的问题是如何访问xzy内部的命名空间modify.有时

globals()[fun.__module__]
Run Code Online (Sandbox Code Playgroud)

作品.但是如果定义modify与其他代码位于不同的文件中,那么我会遇到问题.

python

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

精确,为什么Matlab和Python numpy会给出如此不同的输出?

我知道基本数据类型,浮点类型(float,double)不能完全保存一些数字.

在将一些代码从Matlab移植到Python(Numpy)时,我发现计算中存在一些显着的差异,我认为它会回到精确度.

采用以下代码,对仅具有非零值的前两个元素进行z标准化500维向量.

Matlab的:

Z = repmat(0,500,1); Z(1)=3;Z(2)=1;
Za = (Z-repmat(mean(Z),500,1)) ./ repmat(std(Z),500,1);
Za(1)
>>> 21.1694
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

from numpy import zeros,mean,std
Z = zeros((500,))
Z[0] = 3
Z[1] = 1
Za = (Z - mean(Z)) / std(Z)
print Za[0]
>>> 21.1905669677
Run Code Online (Sandbox Code Playgroud)

除了格式化在Python中显示更多位数之外,还有一个巨大的差异(imho),大于0.02

Python和Matlab都使用64位数据类型(afaik).Python使用'numpy.float64'和Matlab'double'.

为什么差异如此之大?哪一个更正确?

python statistics matlab floating-point-precision

18
推荐指数
2
解决办法
3130
查看次数

将包名称转换为路径

我有一个de.xyz.MyClass存储的类de/xyz/MyClass.java.我如何从班级MyClass本身获得这条道路?

java

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

使用atlas和openblas对numpy进行基准测试时会出现奇怪的结果

与链接到OpenBLAS的numpy相比,我试图改变与ATLAS相关联的numpy的性能.我得到了一些我在下面描述的ATLAS的奇怪结果.

用于评估矩阵 - 矩阵乘法(又名sgemm)的Python代码如下所示:

import sys
sys.path.insert(0, "numpy-1.8.1")

import numpy
import timeit

for i in range(100, 501, 100):
    setup = "import numpy; m1 = numpy.random.rand(%d, %d).astype(numpy.float32)" % (i, i)
    timer = timeit.Timer("numpy.dot(m1, m1)", setup)
    times = timer.repeat(100, 1)
    print "%3d" % i,
    print "%7.4f" % numpy.mean(times),
    print "%7.4f" % numpy.min(times),
    print "%7.4f" % numpy.max(times)
Run Code Online (Sandbox Code Playgroud)

如果我运行这个脚本与numpy链接到ATLAS我测量的时间会有很大的变化.您可以在frist列中看到矩阵大小,然后通过运行矩阵矩阵乘法100倍获得的执行时间的均值,最小值和最大值:

100  0.0003  0.0003  0.0004
200  0.0023  0.0010  0.0073
300  0.0052  0.0026  0.0178
400  0.0148  0.0066  0.0283
500  0.0295  0.0169  0.0531
Run Code Online (Sandbox Code Playgroud)

如果我使用一个线程将numpy链接到OpenBLAS重复此过程,则运行时间会更稳定:

100  0.0002 …
Run Code Online (Sandbox Code Playgroud)

python benchmarking numpy blas atlas

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

运行pytest测试套件时的初始和最终检查

我有我在创建配置文件生产代码$HOME文件夹,并在隔离的环境中我打补丁运行我的测试$HOMEconftest.py.我仍然不确定这是否有效,并且可能会出现无意义的书面测试功能.

为了确保我的测试套件的有效性,我想对各个文件进行初步检查,$HOME并且我想在运行测试套件后进行最终检查.

我怎样才能通过"官方"手段实现这一目标pytest?我有一个肮脏的黑客工作,但搞乱报告.

我的测试套件现在是正确的,这个问题是出于好奇,因为我想了解更多pytest.


增加:同样的问题,但不同的用例:我想检查第三方插件是否满足版本要求.如果不是这种情况,我想显示一条消息并停止py.test.

python pytest

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

与Mac和Linux上的exp函数略有不同

以下C程序在我的Mac和Linux上产生不同的结果.我很惊讶,因为我认为实施libm是以某种方式标准化的

#include<math.h>
#include<stdio.h>

int main()
{
  double x18=-6.899495205106946e+01;
  double x19 = exp(-x18);
  printf("x19     = %.15e\n", x19);
  printf("x19 hex = %llx\n", *((unsigned long long *)(&x19)));
}
Run Code Online (Sandbox Code Playgroud)

Mac上的输出是

x19     = 9.207186811339878e+29
x19 hex = 46273e0149095886
Run Code Online (Sandbox Code Playgroud)

在Linux上

x19     = 9.207186811339876e+29
x19 hex = 46273e0149095885
Run Code Online (Sandbox Code Playgroud)

两者都编译时没有任何优化标志,如下所示:

gcc -lm ....
Run Code Online (Sandbox Code Playgroud)

我知道我永远不应该比较漂浮物.

在调试期间出现了这个问题,遗憾的是使用这种计算证明的算法在数值上不稳定,这种微小的差异导致最终结果的显着偏差.但这是一个不同的问题.

令我感到惊讶的是,这些基本操作exp并未标准化,因为我可以期待IEEE 754规定的基本代数运算.

libm对于不同机器或不同版本的不同实现,是否有任何关于精度的假设?


由于下面的讨论我曾经mpmath计算过高于机器精度的值,我得到两个数字的结果9.2071868113398768244,所以对于我的两个结果,最后一个数字已经错了.linux上的结果可以通过向下舍入此值来解释,如果计算机使用四舍五入,则Mac结果也会关闭.

c linux precision macos numeric

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

sort_by在pandas中打破> = 0.18.0?

我从像数据框开始

print(df)
                   int          float  _i
1                    2   2.000000e+00   1
3                    3   3.000000e+00   3
2                    3   4.000000e+00   2
4 -9223372036854775808 -1.797693e+308   4
0 -9223372036854775808   1.000000e+00   0
Run Code Online (Sandbox Code Playgroud)

如果我用sort_values两列排序,我得到你在下面看到的输出.所以sort_values似乎什么都不做.如果我只有一个列名它可以工作,我使用它的方式适用于以前的pandas版本.大熊猫有什么变化我不知道吗?

print(df.sort_values(["int", "float"]))
                   int          float  _i
1                    2   2.000000e+00   1
3                    3   3.000000e+00   3
2                    3   4.000000e+00   2
4 -9223372036854775808 -1.797693e+308   4
0 -9223372036854775808   1.000000e+00   0
Run Code Online (Sandbox Code Playgroud)

在熊猫0.17.0我得到:

print(df.sort_values(["int", "float"]))
                   int          float  _i
4 -9223372036854775808 -1.797693e+308   4
0 -9223372036854775808   1.000000e+00   0
1                    2   2.000000e+00   1
3                    3   3.000000e+00   3
2 …
Run Code Online (Sandbox Code Playgroud)

python pandas

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

设置包含TableWidget的对话框窗口的最佳大小

我写了一个只包含TableWigdet的小对话框.如何确定表格的水平尺寸?我想调整对话框窗口的大小,以便在没有水平滚动条的情况下显示表格.

pyqt pyqt4

6
推荐指数
2
解决办法
6581
查看次数

pip/setup.py:依赖关系解析不使用可用的轮子

在我的Python包中,我声明了一个依赖项, setup.py如下所示:

setup(name="xxxx",
      install_requires=["pycryptodome<=3.3"],
      )
Run Code Online (Sandbox Code Playgroud)

如果我上传此软件包并运行

pip install xxxx
Run Code Online (Sandbox Code Playgroud)

pycryptodome虽然PyPI上有预编译的轮子,但是pip获取了源代码分发.如果我跑的pip

pip install "pycryptodome<=3.3"
Run Code Online (Sandbox Code Playgroud)

轮子从PyPI获取并安装.

有没有办法强制pip获取轮子如果可用?

我忘了提到我在Windows上工作.

python setup.py

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

病态矩阵的对角化和无法计算特征向量。numpy/scipy 的不同结果

我正在处理一个包含非常小的元素的稀疏矩阵。考虑一个向量:

vec=[-1.e-76 -1.e-72 -1.e-68 -1.e-64 -1.e-60 -1.e-56 -1.e-52 -1.e-48 -1.e-44
-1.e-40 -1.e-36 -1.e-32 -1.e-28 -1.e-24 -1.e-20 -1.e-16 -1.e-12 -1.e-08
-1.e-04 -1.e-02 -1.e-04 -1.e-08 -1.e-12 -1.e-16 -1.e-20 -1.e-24 -1.e-28
-1.e-32 -1.e-36 -1.e-40 -1.e-44 -1.e-48 -1.e-52 -1.e-56 -1.e-60 -1.e-64
-1.e-68 -1.e-72 -1.e-76]
Run Code Online (Sandbox Code Playgroud)

对于那些感兴趣的人来说,这些数字代表一维系统的跳跃幅度。它们不为零。哈密​​顿量由稀疏矩阵给出:

H=sps.diags([vec,vec],[-1,1],dtype='f8')
Run Code Online (Sandbox Code Playgroud)

我对特征值感兴趣,但对特征向量更感兴趣。据我所知,处理对角化有两种方法: scipy.linalgnumpy.linalg,前者更好。

 denseHam=H.toarray()
Run Code Online (Sandbox Code Playgroud)

正确的特征值谱由所有这些函数给出:

import numpy as np
import scipy.linalg as la
s1= la.eigvalsh(denseHam)
s2= np.linalg.eigvalsh(denseHam)
s3= np.linalg.eigvals(denseHam) #I did not expect that!
Run Code Online (Sandbox Code Playgroud)

正确的频谱是:

spectrum=[-3.16230928e-03 -3.16227766e-08 -3.16227766e-13 -3.16227766e-18
-3.16227766e-23 -3.16227766e-28 -3.16227766e-33 -3.16227766e-38
-3.16227766e-43 -3.16227766e-48 -3.16227766e-53 …
Run Code Online (Sandbox Code Playgroud)

python numpy linear-algebra scipy

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

寻找方法/模块来确定用于构建CPython解释器的编译器

当我在命令行模式下启动Python解释器时,我收到一条消息,说明使用哪个编译器来构建它.有没有办法在Python中获取此信息?我知道我可以启动解释器subprocess.Popen并解析输出,但我正在寻找一种更简单,更优雅的方法.

背景是我想为基于CMake的C++框架构建Python扩展,我想编写一个CMake宏来检查是否安装了正确的编译器.

python cmake

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