我正在尝试编译一个 C++ 模块以使用它,scipy.weave该模块由几个头文件和源 C++ 文件组成。这些文件包含广泛使用 Numpy/C-API 接口的类和方法。但我无法弄清楚如何import_array()成功包含。过去一周我一直在为此苦苦挣扎,我快疯了。我希望你能帮助我,因为weave 帮助不是很解释。
在实践中,我首先调用pycapi_utils了一个模块,该模块包含一些将 C 对象与 Python 对象接口的例程。它由一个头文件pycapi_utils.h和一个源文件组成,pycapi_utils.cpp例如:
//pycapi_utils.h
#if ! defined _PYCAPI_UTILS_H
#define _PYCAPI_UTILS_H 1
#include <stdlib.h>
#include <Python.h>
#include <numpy/arrayobject.h>
#include <tuple>
#include <list>
typedef std::tuple<const char*,PyObject*> pykeyval; //Tuple type (string,Pyobj*) as dictionary entry (key,val)
typedef std::list<pykeyval> kvlist;
//Declaration of methods
PyObject* array_double_to_pyobj(double* v_c, long int NUMEL); //Convert from array to Python list (double)
...
...
#endif
Run Code Online (Sandbox Code Playgroud)
和
//pycapi_utils.cpp
#include "pycapi_utils.h" …Run Code Online (Sandbox Code Playgroud) 我有一个问题,我需要启动相同的脚本但具有不同的输入参数.
假设我有一个脚本myscript.py -p <par_Val> -i <num_trial>,我需要考虑每个值的N不同par_values(之间x0和x1)和M个试验par_values.
M的每次试验几乎都达到我正在进行的集群的时间限制(我没有权利改变它).所以在实践中我需要NxM独立完成工作.
因为每个批处理作业具有相同的节点/ cpu配置,并且调用相同的python脚本,除了更改输入参数外,原则上,在伪语言中我应该有一个sbatch脚本应该执行以下操作:
#!/bin/bash
#SBATCH --job-name=cv_01
#SBATCH --output=cv_analysis_eis-%j.out
#SBATCH --error=cv_analysis_eis-%j.err
#SBATCH --partition=gpu2
#SBATCH --nodes=1
#SBATCH --cpus-per-task=4
for p1 in 0.05 0.075 0.1 0.25 0.5
do
for i in {0..150..5}
do
python myscript.py -p p1 -v i
done
done
Run Code Online (Sandbox Code Playgroud)
每次调用脚本本身就是一个批处理作业.看看sbatch doc,这个-a --array选项看起来很有希望.但在我的情况下,我需要更改我的每个脚本的输入参数NxM.我怎样才能做到这一点?我不想编写NxM批处理脚本,然后txt按照这篇文章的建议将它们列在一个文件中.这里提出的解决方案似乎也不是理想的,因为这是工作阵列的情况.此外,我想确保所有NxM脚本同时启动,并且调用上面的脚本立即终止,这样它就不会与时间限制冲突,我的整个工作将被系统和保持不完整(然而,由于每个NxM …
我有一个std::list<some_object> events,我想删除该列表中除最后一个之外的所有元素.所以我想到了(正如这个帖子所建议的那样):
std::list<some_object>::iterator it = events.begin(); // Init iterator on top of list
while(it!=*std::advance(events.end(),-1)) events.erase(it++);
Run Code Online (Sandbox Code Playgroud)
不幸的是,上面的代码不起作用,因为它会产生错误:
error: invalid initialization of non-const reference of type ‘std::_List_iterator<node_info>&’ from an rvalue of type ‘std::__cxx11::list<node_info>::iterator {aka std::_List_iterator<node_info>}’
while(it!=*std::advance(event_heap.end(),-1)){
Run Code Online (Sandbox Code Playgroud)
但是,是不是list::end应该返回迭代器?我究竟做错了什么?
如何加速构造一个非常大的稀疏矩阵,其中每行只有一个非零元素对应于一列,并且每列有相同数量(平均)的非零元素?
N1我有一个大小为×的巨大(稀疏)矩阵N2,例如大小为1e8× 5e4,其中每一行仅包含一个非零元素,该元素是随机选择的,而不用 替换numpy.random.choice(numpy.arange(N2),size=N2,replace=False)。
据我所知,构建矩阵的唯一方法是循环numpy.random.choice()运行。由于非常大,为了加快速度,我正在使用:forN1N1scipy.weave
import numpy as np
from scipy import weave
from scipy.weave import converters
import scipy.sparse as sparse # Cython import
def weave_sparse(N1,N2,w):
conn_matrix = sparse.dok_matrix((N1,N2))
fac = lambda N : np.random.choice(np.arange(N), size=N, replace=False)[0]
code = """
int i;
py::tuple arg(1);
arg[0] = N2;
for(i=0;i<N1;i++) conn_matrix[i,(int) fac.call(arg)] = w;
"""
weave.inline(code,['conn_matrix','N1','N2', 'w', 'fac'],
compiler='gcc',extra_compile_args=['-std=c++11 -Ofast'],force=0)
return conn_matrix
Run Code Online (Sandbox Code Playgroud)
尽管如此,对于N1接近1e6和超越代码来说,它需要很长时间才能完成。我怀疑可能有一种更有效的方法来构建稀疏矩阵。还有其他策略可以在人类可读的时间内加速和构建矩阵吗?
c++ ×2
arrays ×1
c ×1
for-loop ×1
list ×1
listiterator ×1
numpy ×1
python ×1
python-2.7 ×1
python-c-api ×1
sbatch ×1
scipy ×1
slurm ×1
stdlist ×1
stl ×1