小编Nap*_*eis的帖子

来自xyz数据的Matplotlib轮廓:griddata无效索引

我正在尝试使用具有以下格式的文件的matplotlib来绘制等高线图:

x1 y1 z1

x2 y2 z2

等等

我可以用numpy.loadtxt加载它来获取向量.到目前为止,没有麻烦.

我读这个是为了学习如何绘图,并且可以通过复制粘贴来重现它,所以我确定我的安装没有错:

http://matplotlib.org/examples/pylab_examples/griddata_demo.html

我知道我必须输入x和y作为矢量,z作为数组输入,这可以用griddata完成.这也是我在这个网站上找到的.

文件说:

zi = griddata(x,y,z,xi,yi)将形式z = f*(*x,y)的表面拟合到(通常)非均匀间隔矢量(x,y,z)中的数据.griddata()在(xi,yi)指定的点处插入此曲面以生成zi.xi和yi必须描述规则网格,可以是1D或2D,但必须单调递增.

为了这个例子,我写了这段代码:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as ml

x=np.linspace(1.,10.,20)
y=np.linspace(1.,10.,20)
z=np.linspace(1.,2.,20)

xi=np.linspace(1.,10.,10)
yi=np.linspace(1.,10.,10)

zi = ml.griddata(x,y,z,xi,yi)
Run Code Online (Sandbox Code Playgroud)

但是,当涉及到griddata时,我收到以下错误:IndexError:无效索引

所以,我试着修改一下doc的例子,如下所示:

from matplotlib.mlab import griddata
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2.1,2.1,300)
y = np.linspace(-2.1,2.1,300)
z = x*np.exp(-x**2-y**2)
# define grid.
xi = np.linspace(-2.1,2.1,100)
yi = np.linspace(-2.1,2.1,200)
# grid the data.
zi = griddata(x,y,z,xi,yi,interp='linear')
Run Code Online (Sandbox Code Playgroud)

我得到了同样的错误.我不明白出了什么问题.

谢谢你的帮助.

python interpolation matplotlib

8
推荐指数
2
解决办法
3万
查看次数

为什么从new []添加两个std :: vectors比原始数组慢?

我正在寻找OpenMP,部分原因是我的程序需要添加非常大的向量(数百万个元素).但是,如果我使用std :: vector或raw数组,我会看到相当大的差异.我无法解释.我坚持认为差异只在于循环,而不是当然的初始化.

我所指的时间差异,只是添加的时间,特别是不考虑矢量,数组等之间的任何初始化差异.我实际上只是谈论总和部分.在编译时不知道向量的大小.我g++在Ubuntu 16.04上使用5.x.

编辑:我测试了什么@Shadow说,它让我思考,是否有一些优化正在进行?如果我编译-O2,然后,使用初始化的原始数组,我回来进行循环缩放与线程数.但是使用-O3或者-funroll-loops,就好像编译器在早期启动并在看到编译指示之前进行优化.

我想出了以下简单测试:

#define SIZE 10000000
#define TRIES 200
int main(){

    std::vector<double> a,b,c;
    a.resize(SIZE);
    b.resize(SIZE);
    c.resize(SIZE);

    double start = omp_get_wtime();
    unsigned long int i,t;
    #pragma omp parallel shared(a,b,c) private(i,t)
    {
    for( t = 0; t< TRIES; t++){
       #pragma omp for
       for( i = 0; i< SIZE; i++){
        c[i] = a[i] + b[i];
       }
    }
    }

    std::cout << "finished in " << omp_get_wtime() - start << std::endl;

    return …
Run Code Online (Sandbox Code Playgroud)

c++ linear-algebra openmp compiler-optimization

7
推荐指数
2
解决办法
235
查看次数

使用异步共享 numpy 数组的 python 多处理:池与队列

我希望在规则网格上生成周期性柏林噪声。我需要生成多个地图,并且网格非常大,因此我想使用多重处理,为每个核心生成一个地图。

这些地图将绘制在一个图形上,并一个接一个地放在一个二进制 dat 文件中。这些地图将存储在单个 numpy 数组中,其大小为地图数量*节点数量,因此切片将是一个地图,因此我可以同时访问数组的不同区域而无需担心。

我以这个线程作为参考,它使用一个池,而这个线程,我使用一个队列在多处理中做一些绘图。

我想出了两个代码:带有队列的代码在我自己的计算机上运行良好,但在我实验室的工作站或我的专业笔记本电脑上运行不佳:我没有错误消息,它只是在某个时刻冻结。第二个示例工作得很好,而且我发现它比第一个示例更简单,因为我只是直接写入 numpy 数组。(我不太明白第一个链接的异步情况下所有函数和 init 的需要。)

我的问题是:为什么我的第一个代码有问题?我只将我认为相关的代码放在下面。

感谢您的帮助。

第一次尝试:

def generate_irradiation_maps(rad_v):
    while tasks_queue.empty() == False:
        print("fetching work ...")
        map_index = tasks_queue.get()  # get some work to do from the queue
        print("----> working on map: %s" % map_index)
        perm = range(permsize)
        random.shuffle(perm)
        perm += perm
        for i in range(nb_nodes):
            # call the perlin function: fBm
            rad_v[map_index, i] = fBm(perm, x[i] * freq, y[i] * freq, int(sizex *     freq), int(sizey * freq), octs, …
Run Code Online (Sandbox Code Playgroud)

python numpy pool multiprocessing

5
推荐指数
1
解决办法
2779
查看次数

使用自定义构建的gcc时程序链接失败

我正在运行fedora 21发行版,默认gcc为4.9.我在/ usr/local/gcc48中有一个自定义构建的gcc/g ++ 4.8(例如,cuda需要gcc = <4.8,我使用update-alternatives来选择这个)我一直用这个版本4.8编译一些小程序到目前为止没有问题.

现在,我获得了一个使用vtk库和其他库的源代码.如果我使用默认的gcc 4.9,cmake并使工作正常.但是,当使用gcc48时,我得到:

/usr/lib64/vtk/libvtkCommonDataModel.so.1: référence indéfinie vers « std::__throw_out_of_range_fmt(char const*, ...)@GLIBCXX_3.4.20 »
/lib64/libicuuc.so.52: référence indéfinie vers « __cxa_throw_bad_array_new_length@CXXABI_1.3.8 »
collect2: erreur: ld a retourné 1 code d'état d'exécution
CMakeFiles/main.dir/build.make:365: recipe for target '../bin/main'   failed
make[2]: *** [../bin/main] Error 1
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/main.dir/all' failed
make[1]: *** [CMakeFiles/main.dir/all] Error 2
Makefile:76: recipe for target 'all' failed
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)

我明白这是一个链接器错误,我试图指向LD_LIBRARY_PATH =/usr/local/gcc48/lib或LD_LIBRARY_PATH =/usr/local/gcc48/lib64,但我卡住了.

这里有什么问题 ?

谢谢

c++ linker gcc

4
推荐指数
2
解决办法
7743
查看次数

为什么 cmake 在 git commit 后编译所有内容

假设我有时在 Linux 上使用 cmake 2.8 编译一段代码。

我更改了一个文件“my_changed_file”,运行 cmake,并且只构建了这个文件。到目前为止,一切都很好。

现在我想提交这个:

git add my_changed_file
git commit
Run Code Online (Sandbox Code Playgroud)

如果我再次运行 cmake,我希望什么也不会发生。但我的所有文件都被重新编译,尽管我没有触及任何东西!当我执行 ls -l 时,时间戳似乎未受影响。

我确实有这些行:

execute_process(
  COMMAND git describe --abbrev=8 --dirty --always --tags
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  OUTPUT_VARIABLE GIT_CODE_VERSION
  OUTPUT_STRIP_TRAILING_WHITESPACE
)
add_definitions("-DCODE_VERSION=${GIT_CODE_VERSION}")
Run Code Online (Sandbox Code Playgroud)

但它只影响文件main.cpp

怎么了 ?

谢谢

git compilation cmake

3
推荐指数
1
解决办法
1483
查看次数

c ++将类方法作为参数传递给带有模板的类方法

我正在尝试使用模板将类方法传递给另一个类方法,并且找不到任何关于如何做的答案(没有C++ 11,提升确定):

我将核心问题简化为:

class Numerical_Integrator : public Generic Integrator{
    template <class T>
    void integrate(void (T::*f)() ){
         // f(); //already without calling  f() i get error
    }
}

class Behavior{
    void toto(){};

    void evolution(){
        Numerical_Integrator my_integrator;
        my_integrator->integrate(this->toto};
}
Run Code Online (Sandbox Code Playgroud)

我得到了错误:

error: no matching function for call to ‘Numerical_Integrator::integrate(<unresolved overloaded function type>)’this->toto);
note:   no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘void (Behavior::*)()’
Run Code Online (Sandbox Code Playgroud)

谢谢.

奖金:争论怎么样?

class Numerical_Integrator{
    template <class T, class Args>
    double integrate(void (T::*f)(), double a, Args arg){ …
Run Code Online (Sandbox Code Playgroud)

c++ templates member-functions c++03

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