小编Spi*_*ros的帖子

与 gridspec 子图共享轴

我正在使用嵌套GridSpecFromSubplotSpec来创建嵌套的轴网格。我有两组独立的轴,顶部轴和底部轴。每组有四个轴,排列在 2x2 网格中。

这是我正在使用的代码和我获得的结果:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gsp

fig = plt.figure()
global_gsp = gsp.GridSpec(2, 1)

for i in range(2):
    axes = np.empty(shape=(2, 2), dtype=object)
    local_gsp = gsp.GridSpecFromSubplotSpec(2, 2, subplot_spec=global_gsp[i])

    for j in range(2):
        for k in range(2):
            ax = plt.Subplot(fig, local_gsp[j, k],
                             sharex=axes[0, 0], sharey=axes[0, 0])
            fig.add_subplot(ax)
            axes[j, k] = ax

    for j in range(2):
        for k in range(2):
            ax = axes[j, k]
            x = i + np.r_[0:1:11j]
            y = …
Run Code Online (Sandbox Code Playgroud)

python plot matplotlib

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

强制 find_library 再次搜索

在我的 CMake 脚本中,我必须链接到一个可以有两个不同名称的库,具体取决于缓存变量。

该库可以是 libMyLibrary.a 或 libMyLibraryCUDA.a,具体取决于CUDA_BACKEND设置为 ON 还是 OFF。CUDA_BACKEND是一个缓存变量。两个库都在同一个目录中,其路径存储(在用户输入之后)在变量中MYLIBRARY_ABSOLUTE_PATH

if ( CUDA_BACKEND )
    set ( MYLIBRARY_NAME "MyLibraryCUDA" )
else ( CUDA_BACKEND )
    set ( MYLIBRARY_NAME "MyLibrary" )
endif ( CUDA_BACKEND )

find_library ( MYLIBRARY_LIBRARY
    NAMES "${MYLIBRARY_NAME}"
    PATHS "${MYLIBRARY_ABSOLUTE_PATH}/lib"
)
Run Code Online (Sandbox Code Playgroud)

如果用户更改了CUDA_BACKENDcmake的值并运行,find_library则不会再次运行,因为该变量MYLIBRARY_LIBRARY包含有效路径(遵循文档):

一旦其中一个调用成功,结果变量将被设置并存储在缓存中,这样调用就不会再次搜索。

所以,我的问题是:强制find_library再次搜索库的最干净的方法是CUDA_BACKEND更改的值?

cmake

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

线程局部变量的初始化

我最近使用了一个对象,其目的是将内存作为单例进行分配和释放。就像是

class MyValue
{
  // ...

  static Allocator& GetAllocator()
  {
    static Allocator allocator;
    return allocator;
  }

  // ...
};
Run Code Online (Sandbox Code Playgroud)

后来我意识到它Allocator不是线程安全的:当多个线程同时使用同一个分配器时,偶尔会发生奇怪的事情,导致断言和分段错误。

解决方案:为不同的线程使用不同的分配器:

class MyValue
{
  // ...

  static Allocator& GetAllocator()
  {
    thread_local static Allocator allocator;
    return allocator;
  }

  // ...
};
Run Code Online (Sandbox Code Playgroud)

惊人的!我的问题都消失了!只有一个问题: 每次创建线程时我的分配器变量都会被初始化,即使大多数线程不会使用该变量?

分配器的初始化可能是繁重的操作,因此我希望仅在实际需要时才对其进行初始化,而不是在每个线程中进行初始化。

我读到thread_local变量是由每个线程分配的。这是否意味着它们也是被构建的?这种分配(或构造)是针对创建的每个线程系统地发生还是仅针对使用它的线程发生?

我依稀记得在课程中听说过有关线程和线程本地存储的大多数细节都依赖于平台。如果是这样的话,我对 Linux 和 FreeBSD 特别感兴趣。


相关(有趣的读物,但我在那里找不到答案):

c++ multithreading thread-local-storage c++11

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

matplotlib 中的图例标题板

我希望我的 matplotlib 图的图例中的标题与图例的内容更远。目前,我有以下几点:当前图例,标题与内容太接近

我看到类的set_title函数Legend接受一个prop字典,应该是文本属性页中描述的那个。这其中包含字段bbox,其中pad可以添加的属性。但是当我尝试以下操作时

legend.set_title('Legend', prop={'bbox':{'pad':somepad}})
Run Code Online (Sandbox Code Playgroud)

python 抱怨这bbox不是一个可接受的参数。

我在 Arch Linux 上使用 Python 3.6.3 下的 matplotlib 2.1.0。


一个明显的解决方法是添加换行符,如下所示:

legend.set_title('Legend\n ')
Run Code Online (Sandbox Code Playgroud)

虽然人们可能会喜欢这个结果,但 matplotlib 的一大优势是一切都可以配置到最细微的细节,所以我正在寻找一种解决方案,让我可以更细粒度地控制这个间距。

python matplotlib legend legend-properties

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