我是Python和Matplotlib的新手,我想简单地将colormap应用于图像并编写生成的图像,而不使用轴,标签,标题或通常由matplotlib自动添加的任何内容.这是我做的:
def make_image(inputname,outputname):
data = mpimg.imread(inputname)[:,:,0]
fig = plt.imshow(data)
fig.set_cmap('hot')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig(outputname)
Run Code Online (Sandbox Code Playgroud)
它成功地移除了图形的轴,但保存的图形呈现白色填充和实际图像周围的框架.如何删除它们(至少是白色填充)?谢谢
请考虑以下C ++程序:
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> v(2, std::string(24,0));
for (auto& s : v) {
std::cout << "Address: " << (void*)s.data() << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望向量中的每个字符串都指向不同的内存区域,但是在使用gcc 6.3.0和8.2.1进行编译时-D_GLIBCXX_USE_CXX11_ABI=0,它们显示相同的地址。(在不带标志的情况下进行编译时,它们将显示不同的地址)。这是为什么?
我正在使用Boost multi_index容器来根据2个整数键K1和K2存储对象.我可以轻松地检索满足"K1 == X"的所有元素的迭代器,例如,通过获取第一个索引并使用find()函数(对于K2和值Y),但我正在寻找一种方法获得满足K1 == X和K2 == Y的所有元素的迭代器.一个明显的解决方案是在满足K1 == X的所有元素上获得迭代器,然后使用谓词K2 == Y构建boost :: filter_iterator,但是有没有办法(可能更有效)只能从Boost.MultiIndex?
谢谢
马蒂厄
当两个进程共享打开的一段内存shm_open然后对其进行mmap-ed 时,在一个进程中对共享内存的一部分进行操作是否会影响另一个进程在同一部分上mprotect看到的权限?换句话说,如果一个进程将共享内存段的一部分设置为只读,那么它对于另一进程也将变为只读吗?
我正在使用SMP超级计算机上的MPI程序.我想确定哪些进程共享同一节点,例如通过设置在同一节点上的所有进程中相等的整数键,以及从节点到另一个节点的不同.然后,目标是使用该密钥来分割通信器并使子通信器仅收集同一节点中的进程.
所以函数看起来像
int identify_node(MPI_Comm* comm); // returns a key characterizing a node
Run Code Online (Sandbox Code Playgroud)
假设node_1上的0,1,2,3,node_2上的4,5,6,7等过程的简单分布,这是一个简单公式的问题,但我希望在没有假设的情况下实现相同的结果关于分配.
我有一个想法如何使用MPI_Get_processor_name来做到这一点:通过计算名称的哈希并假设没有两个名称将获得相同的哈希(我不喜欢这样,因为如果有一天我有两个具有相同哈希的名称,它将难以跟踪问题),或跨进程使用某种协议算法(哪一个?我还不知道).
你会怎么做(尽可能有效)?
马蒂厄
我有一个嵌入到 C++ MPI 应用程序中的 Python 3 解释器。此应用程序加载脚本并将其传递给解释器。
当我在没有 MPI 启动器的情况下在 1 个进程上执行程序时(只需调用 ./myprogram),脚本会正确执行并且它的“打印”语句输出到终端。当脚本有错误时,我使用 PyErr_Print() 在 C++ 端打印它。
但是,当我通过 mpirun 启动程序时(即使在单个进程上),我没有从 python 代码中的“打印”中得到任何输出。当我的脚本有错误时,我也没有从 PyErr_Print() 得到任何信息。
我猜想 Python 处理标准输出的方式与 MPI(这里实际上是 Mpich)处理将进程的输出重定向到启动器并最终重定向到终端的方式不匹配。
关于如何解决这个问题的任何想法?
在混合C/Fortran应用程序的上下文中,有没有办法检查编译器是否知道"iso_c_binding"(例如GCC 4.1.2不知道它,而4.3.4确实如此),就像预处理指令一样或者其他的东西?我不能简单地检查GCC的版本,因为我可能会使用其他编译器.
谢谢
这是一个显然不起作用的代码,因为在构造函数中向下转换“this”是非法的:
#include <cassert>
class A {
protected:
virtual ~A() {}
public:
A();
};
class B : public A {
};
A::A() {
assert(dynamic_cast<B*>(this));
}
int main(void) {
B b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,当用 g++ 编译时,断言失败。
然而,这是另一个有效的代码(至少在 g++ 4.7 中,我没有尝试过其他编译器):
#include <cassert>
class A {
protected:
virtual ~A() {}
public:
A() {}
void f();
};
class B : public A {
public:
B() {
f();
}
};
void A::f() {
assert(dynamic_cast<B*>(this));
}
int main(void) {
B b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:第二个代码是否“合法”,即我可以期望任何编译器都能以这种方式工作吗? …
我有一个 bash 脚本a.sh,如下所示:
#!/bin/bash
echo $#
echo $1
Run Code Online (Sandbox Code Playgroud)
和一个b.sh如下所示的脚本:
#!/bin/bash
source ./a.sh
Run Code Online (Sandbox Code Playgroud)
如果我调用,./a.sh我会正确地得到 0 和一个空行作为输出。调用时./a.sh blabla我得到 1 和 blabla 作为输出。
然而,当我打电话时,我也会得到 1 和 blabla 作为输出,即使没有从内部./b.sh blabla传递任何参数。a.shb.sh
这似乎与使用有关source(我必须使用它,因为在我的实际用例中,a.sh导出了一些变量)。如何避免参数被b.sh传播到a.sh?我考虑过使用eval $(a.sh),但这使我的echo陈述a.sh失败。我想在调用之前使用shift消耗参数,但我不一定知道有多少参数。b.sha.sh
c ×4
c++ ×4
mpi ×3
python ×2
bash ×1
boost ×1
communicator ×1
downcast ×1
dynamic-cast ×1
fortran ×1
inheritance ×1
matplotlib ×1
memory ×1
mprotect ×1
preprocessor ×1
shared ×1