我想通过使用BLAS和LAPACK在C或C++中编写一些模块来扩展python和numpy.我还希望能够将代码作为独立的C/C++库进行分发.我希望这个库使用单精度和双精度浮点数.我将编写的函数的一些示例是用于求解线性系统或加速一阶方法的共轭梯度.有些函数需要从C/C++代码调用Python函数.
在使用Python/C API和Numpy/C API稍微玩了一下之后,我发现许多人主张使用Cython(例如参见这个问题或者这个问题).我不是Cython的专家,但似乎在某些情况下,你仍然需要使用Numpy/C API并知道它是如何工作的.鉴于我已经拥有(一些)关于Python/C API的知识而没有关于Cython的知识,我想知道继续使用Python/C API是否有意义,并且如果使用此API比Cython有一些优势.在未来,我肯定会开发一些不涉及数值计算的东西,所以这个问题不仅仅是关于numpy.我喜欢Python/C API的一个原因是我学到了一些关于Python解释器如何工作的东西.
谢谢.
我正在研究概率模型,在对这些模型进行推理时,估计的概率可能变得非常小.为了避免下溢,我目前在日志域工作(我存储概率的日志).乘法概率相当于一个加法,并使用以下公式求和:
log(exp(a) + exp(b)) = log(exp(a - m) + exp(b - m)) + m
Run Code Online (Sandbox Code Playgroud)
哪里m = max(a, b).
我使用了一些非常大的矩阵,我必须采用这些矩阵的元素指数来计算矩阵向量乘法.这一步非常昂贵,我想知道在处理概率时是否存在其他方法来处理下溢.
编辑:出于效率原因,我正在寻找使用原始类型的解决方案,而不是存储实数的任意精度表示的对象.
编辑2:我正在寻找比日志域技巧更快的解决方案,而不是更准确的解决方案.我对目前的准确性感到满意,但我需要一种更快的方法.特别是,在矩阵向量乘法期间进行求和,并且我希望能够使用有效的BLAS方法.
解决方案:在与Jonathan Dursi讨论之后,我决定按其最大元素分解每个矩阵和向量,并将该因子存储在日志域中.乘法很简单.在添加之前,我必须通过两个因子的比率将一个添加的矩阵/向量分解.我每十次操作更新一次因子.
我正在寻找一种方法来重新调整大量不适合内存的数据(大约40GB).
我有大约3000万个可变长度的条目,存储在一个大文件中.我知道该文件中每个条目的起始位置和结束位置.我需要将这些不适合RAM的数据洗牌.
我想到的唯一解决方案是使用Fisher-Yates算法1对包含数字的数组进行混洗N,其中N是条目数,然后根据此顺序将条目复制到新文件中.不幸的是,这个解决方案涉及大量的搜索操作,因此会非常慢.
是否有更好的解决方案来均匀分布大量数据?