是否有Pythonic方法只运行一个程序实例?
我提出的唯一合理的解决方案是尝试在某个端口上将其作为服务器运行,然后第二个程序尝试绑定到同一个端口 - 失败.但这不是一个好主意,也许有比这更轻巧的东西?
(考虑到程序有时会失败,即段错误 - 所以像"锁定文件"这样的东西不起作用)
更新:提供的解决方案比仅存在一个不存在的服务器的端口要复杂得多且不太依赖,所以我必须使用那个.
注意:这要求反转通常的元组到数组转换.
我必须将一个参数传递给(包装的c ++)函数作为嵌套元组.例如,以下工作
X = MyFunction( ((2,2),(2,-2)) )
Run Code Online (Sandbox Code Playgroud)
而以下则没有
X = MyFunction( numpy.array(((2,2),(2,-2))) )
X = MyFunction( [[2,2],[2,-2]] )
Run Code Online (Sandbox Code Playgroud)
不幸的是,我想要使用的论点是一个numpy数组.对于某些N,该数组总是具有2xN的尺寸,这可能非常大.
有没有一种简单的方法将其转换为元组?我知道我可以循环,创建一个新的元组,但更喜欢numpy数组提供的一些不错的访问.
如果不可能像我希望的那样做得很好,通过循环或其他什么方式来做最漂亮的方法呢?
我有一个与SWIG很好地合作的小项目.特别是,我的一些函数返回std::vector
s,它们被转换为Python中的元组.现在,我做了很多数字,所以我只是让它们从c ++代码返回后将这些转换为numpy数组.为此,我在SWIG中使用类似下面的内容.
%feature("pythonappend") My::Cool::Namespace::Data() const %{ if isinstance(val, tuple) : val = numpy.array(val) %}
Run Code Online (Sandbox Code Playgroud)
(实际上,有几个函数名为Data,其中一些返回浮点数,这就是为什么我检查它val
实际上是一个元组.)这很有效.
但是,我也想使用-builtin
现在可用的旗帜.调用这些数据函数很少见,而且大部分都是交互式的,所以它们的缓慢不是问题,但是还有其他慢速循环,内置选项显着加速.
问题是当我使用该标志时,会自动忽略pythonappend功能.现在,Data再次返回一个元组.有什么方法我仍然可以返回numpy数组?我尝试使用打字机,但它变成了一个巨大的混乱.
Borealid非常好地回答了这个问题.为了完整性,我包含了一些我需要的相关但略有不同的类型图,因为我通过const引用返回并使用向量向量(不要启动!).这些是不同的,我不希望任何其他人绊倒试图找出微小的差异.
%typemap(out) std::vector<int>& {
npy_intp result_size = $1->size();
npy_intp dims[1] = { result_size };
PyArrayObject* npy_arr = (PyArrayObject*)PyArray_SimpleNew(1, dims, NPY_INT);
int* dat = (int*) PyArray_DATA(npy_arr);
for (size_t i = 0; i < result_size; ++i) { dat[i] = (*$1)[i]; }
$result = PyArray_Return(npy_arr);
}
%typemap(out) std::vector<std::vector<int> >& {
npy_intp result_size = $1->size();
npy_intp result_size2 = (result_size>0 ? …
Run Code Online (Sandbox Code Playgroud) 我和ipython的dev分支保持同步(因为ipython几乎是最棒的东西).最近(在昨天令人敬畏的ipython 2.0发布之前)我注意到它已经开始自动关闭括号,括号,引号等,因为我输入它们.它发生在两个终端[我在终端中使用的其他东西都没有]和笔记本会话,所以我认为这是开发人员的有意选择.我可以尊重其他人可能喜欢这个功能,但它让我完全疯了.
我在配置文件中找不到任何选项.我甚至不能谷歌,因为我不知道它叫什么.唯一出现的是自动括号的不同特征.我确实找到了这个问题,但那已经过时了,并且暗示我所看到的行为不会发生.
如何关闭此功能?
[我大多只是使用笔记本界面,所以只需将其关闭就可以了,但我更愿意在终端的笔记本和ipython会话中关闭它.]
(简要)文档scipy.integrate.ode
说两个方法(dopri5
和dop853
)具有逐步控制和密集输出.看一下示例和代码本身,我只能看到从集成器获取输出的一种非常简单的方法.也就是说,看起来你只是通过一些固定的dt向前推进积分器,得到当时的函数值,然后重复.
我的问题有很多可变的时间尺度,所以我想在需要评估的任何时间步长得到值,以达到所需的公差.也就是说,在早期,事情正在缓慢变化,因此输出时间步长可能很大.但随着事情变得有趣,输出时间步长必须更小.我实际上并不想要等间隔的密集输出,我只想要自适应函数使用的时间步长.
一个相关的概念(几乎相反)是"密集输出",其中所采取的步骤与步进器所采取的步骤一样大,但函数的值被插值(通常具有与步进器精度相当的精度)你要.fortran底层scipy.integrate.ode
显然能够做到这一点,但ode
没有界面. odeint
另一方面,它基于不同的代码,并且显然确实执行密集输出.(您可以在每次调用右侧时输出以查看何时发生,并看到它与输出时间无关.)
所以我仍然可以利用自适应性,只要我能够提前确定我想要的输出时间步长.不幸的是,对于我最喜欢的系统,我甚至不知道大概的时间尺度是什么时间函数,直到我运行集成.因此,我必须将采用一个积分器步骤的想法与这种密集输出的概念结合起来.
显然,scipy 1.0.0通过新接口引入了对密集输出的支持.特别是,他们建议远离scipy.integrate.odeint
和朝向scipy.integrate.solve_ivp
,作为关键字dense_output
.如果设置为True
,则返回的对象具有sol
可以使用数组调用的属性,然后在这些时间返回集成函数值.这仍然没有解决这个问题的问题,但在许多情况下它很有用.
在IPython笔记本(例如v3.1)中,我可以添加一个~/.ipython/profile_default/static/custom/custom.js
文件来执行一些自定义JavaScript.例如,我可以这样做:
require(['base/js/namespace', 'base/js/events'], function(IPython, events) {
console.log("A");
events.on('app_initialized.NotebookApp', function() {
console.log("B");
});
console.log("C");
});
Run Code Online (Sandbox Code Playgroud)
然后,在JS控制台中,我会看到A
,接着是B
,然后是C
.
现在,从版本4.0开始,他们将它分解为Jupyter笔记本.加载相同的文件(尽管事实是它在下面~/.ipython
,而不是在下面~/.jupyter
),并且代码被执行.但是,我不再看到这B
条线.我猜应用程序没有初始化.我仍然看到它在源代码中被触发,但是后来会发生,还是只是不起作用?
我如何让事情再次发挥作用?我不需要再等了app_initialized
吗?在某处记录了这些吗?
这个页面似乎表明,现在的方法是创建一个自定义扩展并将所有操作放在该load_ipython_extension
函数中.是对的吗?如果是这样,mathjax怎么样?和CodeMirror选项?
从...开始
OrderedDict([('a', 1), ('c', 3), ('b', 2)])
Run Code Online (Sandbox Code Playgroud)
有可能最终结束
OrderedDict([('a', 1), ('__C__', 3), ('b', 2)])
Run Code Online (Sandbox Code Playgroud)
确保该'__C__'
项目是在保持秩序之前'b'
和之后'a'
?
我在Python Sympy库中创建一个脚本,并尝试访问solveset()和linsolve()函数返回的结果.我的问题是这些函数返回的对象是有限集类型,我想自动选择一些结果,以便在其他方程中重新输入它.任何人都可以帮助我?
一个例子: 我创建了一个包含两个未知变量的方程列表:
>>> a1, a2 = symbols('a1, a2')
>>> eq2_1 = Eq(-3*a1/10 - 3*a2/20 + 1/12)
>>> eq2_2 = Eq(-3*a1/20 - 13*a2/105 + 1/20)
>>> lista = [eq2_1,eq2_2]
>>> str(lista)
[-3*a1/10 - 3*a2/20 + 1/12, -3*a1/20 - 13*a2/105 + 1/20]
Run Code Online (Sandbox Code Playgroud)
然后使用linsolve()方法解决它.
>>> a = linsolve(lista,a1,a2)
>>> a
{(71/369, 7/41)}
Run Code Online (Sandbox Code Playgroud)
结果是正确的,但我无法将这些结果输入变量.
我尝试了dics,list,tuples,indexing命令,但总是返回错误."Finiteset对象没有属性'命令'"
好吧,这对我来说是一次非常令人沮丧的冒险.我连续几天花了很多时间试图让MathJax启用并识别ipython笔记本中Markdown单元格中的mhchem扩展.数学表达式运行良好,但mhchem宏\ce
\cf
\cee
只是无法识别.我尝试在MathJax/config/default.js
文件中启用扩展程序.我尝试使用Markdown窗口放置以下脚本代码
<script type="text/x-mathjax-config">
MathJax.Hub.Config({TeX: {extensions:["TeX/mhchem.js"]}
...
});
</script>
Run Code Online (Sandbox Code Playgroud)
我已经尝试过在互联网上找到的每一个技巧和提示.似乎没什么用.
我正在运行debian wheezy.我想也许默认的mhchem和MathJax包导致了这个问题,所以我为ipython notebook安装了一个自定义版本的MathJax到我的profile_default/static目录中,并配置了ipython来使用它.再次,数学很好,化学是不行.我可以直接从TeX使用mhchem扩展,但MathJax只是拒绝加载扩展或识别\ce
标记.
我很难过!
有人有主意吗?
对于我使用matplotlib的大多数交互式绘图,我不想使用数学的乳胶处理.(主要是因为它太慢了,但也因为它经常使用IMHO只是有点太模糊.)但是我在编写乳胶时也一直使用我自己的宏.仅作为一个例子,而不是做$M_{\odot}$
我定义的事情$\Msun$
.因此,当使用matplotlib时,我倾向于自动编写后者,然后得到错误并且必须修复它.这只是一个特别简单的例子,我希望能够灵活地在我的论文和我的情节中重新定义一个宏,而不需要太多的工作.
那么,是否有任何合理的方法可以扩展mathtext解析器以理解类似的东西$\Msun$
?或者我是否必须破解mathtext.py或其他什么?
(我的后备是定义Msun
为字符串,r'M_{\odot}'
所以我可以写出类似的东西r'$M = 10\,' + Msun + '$'
,但这是令人不愉快的,当然对我来说不会更自动.)