小编mau*_*zio的帖子

编译多个模块时出现 Numpy/CAPI 错误,import_array()

我正在尝试编译一个 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)

c c++ python numpy python-c-api

4
推荐指数
1
解决办法
6370
查看次数

SLURM sbatch作业数组用于相同的脚本但具有不同的输入参数并行运行

我有一个问题,我需要启动相同的脚本但具有不同的输入参数.

假设我有一个脚本myscript.py -p <par_Val> -i <num_trial>,我需要考虑每个值的N不同par_values(之间x0x1)和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 …

arrays slurm sbatch

4
推荐指数
1
解决办法
5145
查看次数

C++列表擦除到end() - 列表中的1个元素

我有一个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应该返回迭代器?我究竟做错了什么?

c++ stl list stdlist listiterator

2
推荐指数
1
解决办法
1014
查看次数

快速构建非常大的稀疏矩阵

如何加速构造一个非常大的稀疏矩阵,其中每行只有一个非零元素对应于一列,并且每列有相同数量(平均)的非零元素?

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和超越代码来说,它需要很长时间才能完成。我怀疑可能有一种更有效的方法来构建稀疏矩阵。还有其他策略可以在人类可读的时间内加速和构建矩阵吗?

for-loop scipy sparse-matrix python-2.7

2
推荐指数
1
解决办法
1723
查看次数