小编Mik*_*ike的帖子

扩展matplotlib mathtext解析器

对于我使用matplotlib的大多数交互式绘图,我不想使用数学的乳胶处理.(主要是因为它太慢了,但也因为它经常使用IMHO只是有点太模糊.)但是我在编写乳胶时也一直使用我自己的宏.仅作为一个例子,而不是做$M_{\odot}$我定义的事情$\Msun$.因此,当使用matplotlib时,我倾向于自动编写后者,然后得到错误并且必须修复它.这只是一个特别简单的例子,我希望能够灵活地在我的论文和我的情节中重新定义一个宏,而不需要太多的工作.

那么,是否有任何合理的方法可以扩展mathtext解析器以理解类似的东西$\Msun$?或者我是否必须破解mathtext.py或其他什么?

(我的后备是定义Msun为字符串,r'M_{\odot}'所以我可以写出类似的东西r'$M = 10\,' + Msun + '$',但这是令人不愉快的,当然对我来说不会更自动.)

latex matplotlib pyparsing

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

为什么iostream定义了abs函数,我该如何阻止它呢?

以下c ++代码无法编译:

int main() {
  double a = abs(5.1);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

abs当然,它抱怨没有定义.但以下编译:

#include <iostream>

int main() {
  std::cout << abs(5.1) << std::endl;
  std::cout << abs(-5.1) << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它输出两个5(不是5.1).由于很多原因,这很糟糕.首先,abs我是一直使用它的这种自然而常见的功能,但这int部分几乎不是我想要的.其次,对我(或使用我的代码的人)来说,只是编写abs而不是注意它编译但做错了事情太容易了,因为我(他们)非常擅长忽略警告.第三,我只是简单地不明白为什么iostream abs无论如何都要定义一个函数.第四,我真的不明白为什么它会进入全局命名空间.

有什么办法可以阻止这个令人反感的abs函数进入我的全局命名空间吗?

如果重要,我正在使用

gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.6)
Run Code Online (Sandbox Code Playgroud)

c++ gcc

9
推荐指数
2
解决办法
1388
查看次数

分析numba包装的函数的覆盖范围

我已经编写了一个python模块@numba.jit为了提高速度,其中大部分都包装在装饰器中。我还为此模块编写了很多测试,并使用(在Travis-CI上)运行了该模块py.test。现在,我想看看这些测试的覆盖范围,使用pytest-cov,这仅仅是依赖于一个插件coverage(与整合所有这一切的希望工作服)。

不幸的是,似乎numba.jit在所有这些功能上使用都会使人们coverage认为这些功能从未使用过-就是这种情况。因此,我的测试基本上没有报告的报道。这并不是什么大的惊喜,因为numba正在获取该代码并对其进行编译,因此该代码本身实际上从未使用过。但是我希望有时会在python中看到一些神奇的东西...

有什么有用的方法可以将这两个出色的工具结合起来?如果失败,还有其他工具可以用来衡量numba的覆盖率吗?

[我做了一个最小的工作示例,在这里显示了区别。)

coverage.py pytest numba

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

Matplotlib乳胶工作目录/搜索路径

运行latex时,Matplotlib似乎没有在当前工作目录中找到文件.有谁知道它在哪里查找文件?

背景是:我有一个巨大的序言,我\input在处理之前进入乳胶(许多宏,各种usepackages等).在一篇独立的论文中,我做到了\input{BigFatHeader.tex}.因此,当我使用matplotlib时,我尝试在前导码中输入此文件.执行此操作的python代码是

matplotlib.rcParams['text.latex.preamble'].append(r'\input{BigFatHeader.tex}')
Run Code Online (Sandbox Code Playgroud)

而且我可以验证该文件是否在cwd中 - 我在看到它时ls,或者我可以做到os.path.isfile("BigFatHeader.tex")并获得True.但是当我尝试用乳胶绘制一些东西时,python从乳胶工艺中吐出一个大错误信息,最终达到了!LaTeX错误:BigFatHeader.tex找不到文件.所以可能它改变了一些其他目录(不是/tmp/;我检查过)来完成它的工作.知道这可能是什么?

我最小的工作示例是:

import matplotlib
import matplotlib.pyplot as plt
matplotlib.rcParams['text.latex.preamble'] = r'\input{BigFatHeader.tex}'
matplotlib.rcParams['text.usetex'] = True
plt.plot([1,2])
plt.savefig('MWE.pdf')
Run Code Online (Sandbox Code Playgroud)

哪里BigFatHeader.tex可能很简单

\usepackage{bm}
Run Code Online (Sandbox Code Playgroud)

latex matplotlib

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

传递运算符作为函数模板参数

我必须为我制作的一些非常复杂的对象重载基本的算术运算符.到目前为止,我已成功实施operator*; 现在我需要operator+等等.代码operator*非常大,但是operator*operator+我之间的唯一区别在于我使用的一行+而不是*一些复杂的数字.这一行将在一个被多次调用的循环内部,所以我希望它有效,这似乎意味着没有函数指针.(如我错了请纠正我.)

这似乎是模板的完美用法.但我对正确的语法感到茫然.我在ComplicatedObject类定义中思考这样的事情:

template <typename ComplexBinaryOp>
ComplicatedObject BinaryOp(const ComplicatedObject& B) const {
  // Do lots of stuff
  for(unsigned int i=0; i<OneBazillion; ++i) {
    // Here, the f[i] are std::complex<double>'s:
    C.f[i] = ComplexBinaryOp(f[i], B.f[i]);
  }
  // Do some more stuff
  return C;
}

inline ComplicatedObject operator*(const ComplicatedObject& B) const {
  return BinaryOp<std::complex::operator*>(B);
}

inline ComplicatedObject operator+(const ComplicatedObject& B) const {
  return BinaryOp<std::complex::operator+>(B);
}
Run Code Online (Sandbox Code Playgroud)

这个问题是相关的:"作为模板参数传递的函数" …

c++ templates operator-overloading

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

C++ <complex>和<complex.h>在同一个文件中

我有一个使用c ++ <complex>标头和许多std::complex<double>对象的大型代码库.但现在我也想使用其他几个使用的库(fftwspinsfast)<complex.h>.不幸的是,将这两种类型的复合物混合似乎与gcc 4.6.1(可能是其中之一)不相容.

这是一个显示错误的最小工作示例:

// This is what I do for my various complex objects
#include <complex>

// This is one of many things FFTW/spinsfast essentially do
extern "C" {
  #include <complex.h>
}

int main() {
  std::complex<double>(1.0,2.0);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我编译:

> g++ test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:7:8: error: expected unqualified-id before ‘_Complex’
test.cpp:7:8: error: expected ‘;’ before ‘_Complex’
Run Code Online (Sandbox Code Playgroud)

很显然,gcc正在转化std::complex<double>_Complex,某种程度上也是未定义的.[这在我的macbook上工作正常,它使用Apple LLVM 5.1版; …

c++ gcc

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

使用C API创建numpy数组的自定义类对象

使用C API,我想创建一个包含类型对象的numpy数组Quaternion,这是我用C++编写的类.我已经有了这些数组(实际上是a std::vector),我想制作一个副本 - 或者如果可能的话使用相同的内存.

由于这不是基本类型,我需要使用Py_Object类型,不能使用PyArray_SimpleNew或类似的任何容易.

我猜我可能想要使用PyArray_NewFromDescr甚至PyArray_SimpleNewFromDescr,但我完全彻底迷失了如何创建PyArray_Descr我需要描述我的Quaternion类的对象.

谁能给我一些关于如何制作那个descr对象的指针?或者让我更好地了解如何构建我的numpy数组?

这基本上是这个问题的更一般版本,没有分心.

编辑:

使用dastrobu的提示和我的SWIG包装器,我找到了一种方法.我知道不是每个人都在使用SWIG,但对于那些人,我对其他问题的回答显示了我是如何解决的.

python numpy python-c-api python-c-extension

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

使用和不使用`-builtin`交互SWIG模块

我怎么能告诉编译的模块没有 -builtin,一个%importED模块编译 -builtin?当非内置模块假定来自第一个模块的对象具有包装器时,这样做天真地给了我段错误.

(如果所有内容都是在-builtin关闭的情况编译的,或者单独使用第二个模块打开,我就永远不会遇到段错误-builtin;只是在将它们与不同的编译选项一起使用时.)

细节

我有几个单独的模块,我使用SWIG.假设其中一个被命名A,并包含基本对象(四元数).因为它包含许多计算中涉及的基本对象,所以我更喜欢使用SWIG的-builtin选项.我测试了它,这确实在时间上产生了非常显着的差异.

现在,我还有另一个名为B需要使用对象的模块A.但是B包含大量的脂肪复合物,我不会在很多时候使用它,所以我不认为在-builtin这里使用会有很多优势.而且,我真的很喜欢扩展课程B,并做各种不可能的事情-builtin.

问题是我必须在%import A.i里面B.i.但是,生成的代码B假定A对象具有额外的包装器,而不是使用-builtin.因此,当我使用时B,我会遇到段错误.

(至少,我假设segfaults结果因为B假设额外的包装器.我查看了我的B_wrap.cpp文件足以看到它假设存在那些包装器,虽然我不能说我做了任何测试以确保它在哪里问题来自于.但是段错误确实只与Afrom的使用相吻合B.就其自身而言,A从来没有给我任何麻烦.而且,如果我编译AB没有-builtin,我从来没有得到段错误.)

原则上,我可以使用MONK的方法,只是将我需要添加方法的任何类子类化,同时编译所有内容-builtin.但是这会破坏我的C++代码中的名称和我的python代码中的名称之间的良好对应关系,以及要求一组或另一组用户更改他们使用的名称,以及在对接中的一般痛苦.

我为没有MWE而道歉,但我认为这将是一个不合理的大型MWE.

c++ python swig

5
推荐指数
0
解决办法
566
查看次数

通过 C API 创建新的 numpy 标量并实现自定义视图

简洁版本

给定一个内置的四元数数据类型,如何将四元数的 numpy 数组视为具有大小为 4 的额外维度的浮点数 numpy 数组(不复制内存)?

长版

Numpy 内置了对浮点数和复杂浮点数的支持。我需要使用四元数——它概括了复数,但它们不是有两个分量,而是有四个分量。已经有一个非常好的包,它使用 C API 将四元数直接合并到 numpy 中,它似乎可以非常快地完成所有操作。我还需要添加一些四元数函数,但我想我基本上可以处理这些。

但是,我还希望能够在我需要使用 Awesomenumba包编写的其他函数中使用这些四元数。不幸的是,numba 目前无法处理自定义类型。但我不需要那些 numba 函数中的奇特四元数函数;我只需要数字本身。所以我希望能够将四元数数组重新转换为具有一个额外维度(大小为 4)的浮点数数组。特别是,我想只使用数组中已有的数据而不进行复制,并将其视为新数组。我找到了PyArray_View函数,但不知道如何实现它。

(我非常有信心数据连续保存在内存中,我认为这是简单查看它们所必需的。具体来说,elsize = 8*4alignment = 8四元数包中。)

python numpy python-c-api

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

c ++程序中的文字"或"?

我正在将我前面写过的C++函数翻译成python,当时我注意到我的C++代码包含以下几行:

  if(MIsScaledOut()) {
    if(DataType()==UnknownDataType or DataType()==h)
      Descriptor = Descriptor + DataTypeString() + "OverM";
Run Code Online (Sandbox Code Playgroud)

那里有一个or!这可能是因为我之前从python翻译过来,忘记切换到||.

这段代码在各种操作系统中编译,包含各种编译器,我从来没有遇到过它的问题.这是标准,还是我到目前为止刚刚幸运,这是我应该担心的事情?

c c++ keyword

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