MATLAB/Octave 冒号运算符 a:dx:b 的 Python 语法

计算科学 matlab 离散化 八度 麻木的
2021-12-13 15:22:41

我正在尝试用 Python 重写一些 MATLAB/Octave 代码,但我不知道最好或最直观的编写方式是什么

octave:10> dt = 0.1;
octave:12> T = 0:dt:1
T =

    0.00000    0.10000    0.20000    0.30000    0.40000    0.50000    0.60000    0.70000    0.80000    0.90000    1.00000
octave:15> dt = 0.17;
octave:16> T = 0:dt:1
T =

    0.00000    0.17000    0.34000    0.51000    0.68000    0.85000

如所见,它使用步长 0.1 创建区间 [0, 1] 的离散化。我提到了 NumPy/MATLAB mathesaurus 并且它使用arange函数,但它不适合非整数值,因为它在文档中说明并在这个 SO question中显示。另一方面,玩玩linspace对我没有吸引力,因为它处理的是端点,而不是间距。

在 Python 中,这将是一种直接的、单行的方式?

1个回答

MATLAB 和 Octave 容易受到与 Python 相同的微妙浮点问题的影响,如果您没有预料到舍入问题,您可能会得到一个稍微出乎意料的结果。另一方面,这是非常方便的语法!您可以轻松地从 中的现有功能“烘焙”一个简单的函数来执行此操作numpy.linspace,这是一种非常 Pythonic 的做事方式!

# use Python3 syntax in Python2 to get clean, consistent integer division  
from __future__ import division   
import numpy as np

def lrange(r1, inc, r2):
    """Provide spacing as an input and receive samples back by wrapping `numpy.linspace`"""
    n = ((r2-r1)+2*np.spacing(r2-r1))//inc
    return np.linspace(r1,r1+inc*n,n+1)

> lrange(0,0.1,1)
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ])

> lrange(0,0.17,1)
array([ 0.  ,  0.17,  0.34,  0.51,  0.68,  0.85])

编辑:我在计算中添加了一个浮点 epsilon,它将根据Juanlu001 的评论处理操作数/表示中的小浮点错误