我想修改模块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与其他代码位于不同的文件中,那么我会遇到问题.
我知道基本数据类型,浮点类型(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'.
为什么差异如此之大?哪一个更正确?
我有一个de.xyz.MyClass存储的类de/xyz/MyClass.java.我如何从班级MyClass本身获得这条道路?
与链接到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) 我有我在创建配置文件生产代码$HOME文件夹,并在隔离的环境中我打补丁运行我的测试$HOME中conftest.py.我仍然不确定这是否有效,并且可能会出现无意义的书面测试功能.
为了确保我的测试套件的有效性,我想对各个文件进行初步检查,$HOME并且我想在运行测试套件后进行最终检查.
我怎样才能通过"官方"手段实现这一目标pytest?我有一个肮脏的黑客工作,但搞乱报告.
我的测试套件现在是正确的,这个问题是出于好奇,因为我想了解更多pytest.
增加:同样的问题,但不同的用例:我想检查第三方插件是否满足版本要求.如果不是这种情况,我想显示一条消息并停止py.test.
以下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结果也会关闭.
我从像数据框开始
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) 我写了一个只包含TableWigdet的小对话框.如何确定表格的水平尺寸?我想调整对话框窗口的大小,以便在没有水平滚动条的情况下显示表格.
在我的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上工作.
我正在处理一个包含非常小的元素的稀疏矩阵。考虑一个向量:
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.linalg和 numpy.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解释器时,我收到一条消息,说明使用哪个编译器来构建它.有没有办法在Python中获取此信息?我知道我可以启动解释器subprocess.Popen并解析输出,但我正在寻找一种更简单,更优雅的方法.
背景是我想为基于CMake的C++框架构建Python扩展,我想编写一个CMake宏来检查是否安装了正确的编译器.