我正在建立我的numpy/scipy环境基于blas和lapack或多或少基于这个步骤.
当我完成后,如何检查,我的numpy/scipy函数是否确实使用了之前构建的blas/lapack功能?
我想编写一个广泛使用BLAS和LAPACK线性代数功能的程序.由于性能是一个问题,我做了一些基准测试,并想知道,如果我采取的方法是合法的.
可以说,我有三位参赛者,他们希望用简单的矩阵矩阵乘法来测试他们的表现.参赛者是:
dot
.我为不同的维度实现了矩阵 - 矩阵乘法i
.i
为5的增量和matricies运行5-500 m1
和m2
设置了这样的:
m1 = numpy.random.rand(i,i).astype(numpy.float32)
m2 = numpy.random.rand(i,i).astype(numpy.float32)
Run Code Online (Sandbox Code Playgroud)
使用的代码如下所示:
tNumpy = timeit.Timer("numpy.dot(m1, m2)", "import numpy; from __main__ import m1, m2")
rNumpy.append((i, tNumpy.repeat(20, 1)))
Run Code Online (Sandbox Code Playgroud)
有了这个功能
_blaslib = ctypes.cdll.LoadLibrary("libblas.so")
def Mul(m1, m2, i, r):
no_trans = c_char("n")
n = c_int(i)
one = c_float(1.0)
zero = c_float(0.0)
_blaslib.sgemm_(byref(no_trans), byref(no_trans), byref(n), byref(n), byref(n),
byref(one), m1.ctypes.data_as(ctypes.c_void_p), byref(n),
m2.ctypes.data_as(ctypes.c_void_p), byref(n), byref(zero),
r.ctypes.data_as(ctypes.c_void_p), byref(n))
Run Code Online (Sandbox Code Playgroud)
测试代码如下所示:
r = …
Run Code Online (Sandbox Code Playgroud) 有没有办法绕过__init__
python中的类的构造函数?
例:
class A(object):
def __init__(self):
print "FAILURE"
def Print(self):
print "YEHAA"
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个实例A
.它可能看起来像这样,但是这种语法不正确.
a = A
a.Print()
Run Code Online (Sandbox Code Playgroud)
编辑:
一个更复杂的例子:
假设我有一个对象C
,其目的是存储一个参数并对其进行一些计算.但是,该参数不是这样传递的,而是嵌入在一个巨大的参数文件中.它可能看起来像这样:
class C(object):
def __init__(self, ParameterFile):
self._Parameter = self._ExtractParamterFile(ParameterFile)
def _ExtractParamterFile(self, ParameterFile):
#does some complex magic to extract the right parameter
return the_extracted_parameter
Run Code Online (Sandbox Code Playgroud)
现在我想转储并加载该对象的实例C
.但是,当我加载这个对象时,我只有单个变量self._Parameter
,我无法调用构造函数,因为它期望参数文件.
@staticmethod
def Load(file):
f = open(file, "rb")
oldObject = pickle.load(f)
f.close()
#somehow create newObject without calling __init__
newObject._Parameter = oldObject._Parameter
return newObject
Run Code Online (Sandbox Code Playgroud)
换句话说,如果不传递参数文件,则无法创建实例.在我的"真实"的情况,但是,它不是一个参数文件,但一些大数据的垃圾我当然不希望在内存中随身携带,甚至将其存储到光盘上.
因为我想C
从方法返回一个实例,Load …
以下代码如何打印到控制台?
map<int,int> m;
m[0] = m.size();
printf("%d", m[0]);
Run Code Online (Sandbox Code Playgroud)
可能答案:
m[0]
或m.size()
正由编译器首先执行.因此,它可以打印1
以及0
.0
因为首先执行赋值运算符的右侧.它打印1
是因为它operator[]
具有完整语句的最高优先级m[0] = m.size()
.因此,会发生以下事件序列:
m[0]
在地图中创建一个新元素m.size()
被调用现在是 1
m[0]
获得分配先前返回的(由m.size()) 1
真正的答案?,我不知道^^
我想使用numpy或scipy来计算以下内容:
Y = A**T * Q * A
Run Code Online (Sandbox Code Playgroud)
其中A
是m x n
矩阵,A**T
是的转置A
和Q
是一个m x m
对角矩阵.
由于Q
是对角矩阵,因此我只将其对角线元素存储为矢量.
Y
目前我可以想到两种计算方法Y
:
Y = np.dot(np.dot(A.T, np.diag(Q)), A)
和Y = np.dot(A.T * Q, A)
.显然,选项2优于选项1,因为不必创建真正的矩阵diag(Q)
(如果这是numpy真正做的......)
但是,这两种方法都存在必须分配比实际需要更多内存的缺陷,因为A.T * Q
和np.dot(A.T, np.diag(Q))
必须与之一起存储A
以便计算Y
.
是否有numpy的/ SciPy的方法,该方法将消除额外的内存不必要的分配,你将只通过两个矩阵A
和B
(在我的情况B
是A.T
)和权重向量Q
与它一起?
我正在寻找一种从python访问matlab模块的方法.我目前的情况是这样的:
ctypes
并作为指向Lapack例程的指针传递.我现在的问题是:
什么是保持python中所有主要工作的有效方法,同时利用matlab/octave模块提供的可能性.如果我的ctype数组不必转换为其他对象以便运行八度音程,那么它也会很好.但是,我可以看到最后一点很难实现.
我目前的研究向我展示了两种可能的选择
这可能是一个跟进的问题这一个.
我正在使用setuptools来安装我的包.作为依赖,我列出了numpy.我正在使用Python2.7,当我这样做
python setup.py install
Run Code Online (Sandbox Code Playgroud)
用这个setup.py
文件:
from setuptools import setup
setup(name = "test_pack", install_requires = ["numpy"])
Run Code Online (Sandbox Code Playgroud)
我最终得到此错误消息:
ImportError: No module named numpy.distutils
Run Code Online (Sandbox Code Playgroud)
为了包含numpy
作为依赖项并在未安装的情况下安装它,我需要做什么python-dev
?
完整输出python setup.py install
:
running install
running bdist_egg
running egg_info
writing requirements to test_pack.egg-info/requires.txt
writing test_pack.egg-info/PKG-INFO
writing top-level names to test_pack.egg-info/top_level.txt
writing dependency_links to test_pack.egg-info/dependency_links.txt
reading manifest file 'test_pack.egg-info/SOURCES.txt'
writing manifest file 'test_pack.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-x86_64/egg
running install_lib
creating build/bdist.linux-x86_64/egg
creating build/bdist.linux-x86_64/egg/test_pack …
Run Code Online (Sandbox Code Playgroud) 我正在寻找使用c ++进入程序主要功能的最佳实践技巧.目前我认为有两种方法可行.(尽管这些方法的"边缘"可以任意地彼此接近)
1:编写一个"Master"类,接收传递给main函数的参数并处理"Master"类中的完整程序(当然你也使用其他类).因此,主要功能将减少到最小的线.
#include "MasterClass.h"
int main(int args, char* argv[])
{
MasterClass MC(args, argv);
}
Run Code Online (Sandbox Code Playgroud)
2:在主函数中编写"完整"程序,当然利用用户定义的对象!但是,还涉及全局功能,主要功能可能会有所增加.
我正在寻找一些关于如何用c ++编写程序主要功能的一般指导原则.我通过尝试为第一种方法编写一些单元测试来遇到这个问题,这有点困难,因为大多数方法都是私有的.
我在网络驱动器上创建了一个存储库svnadmin create repos
.
有没有办法为存储库设置用户权限?
如果是这种情况,如何设置这些权限?
我正在使用相当多的fortran库来进行一些数学计算.所以numpy中的所有数组都需要Fortran连续.
目前我用numpy.asfortranarray()完成了这个.
我的问题是:
python ×7
numpy ×5
c++ ×3
blas ×2
lapack ×2
scipy ×2
arrays ×1
benchmarking ×1
class ×1
coding-style ×1
constructor ×1
fortran ×1
math ×1
matlab ×1
octave ×1
operators ×1
performance ×1
python-2.7 ×1
setuptools ×1
svn ×1
svnadmin ×1