Python 获取从-X到X均匀分布的值的N元素向量

Python 获取从-X到X均匀分布的值的N元素向量,python,numpy,scipy,Python,Numpy,Scipy,在Matlab中,可以 N=1024; X=1; dx=2*X/(N-1); x=-X:dx:X; 其中一个具有数组x,包括-1和1作为端点 以numpy表示的等效值: from numpy import r_ N=1024 X=1 dx=2*X/N x=r_[-X:X:dx] 给我0.998046875作为x[N-1],这是不对的。如上所述使用N-1可以得到一个N-1元素数组,这肯定不是我想要的,也不会以1结尾。我已经验证了x.dtype是float64,这与Matlab的表示法相同 如何

在Matlab中,可以

N=1024;
X=1;
dx=2*X/(N-1);
x=-X:dx:X;
其中一个具有数组
x
,包括
-1
1
作为端点

以numpy表示的等效值:

from numpy import r_
N=1024
X=1
dx=2*X/N
x=r_[-X:X:dx]
给我
0.998046875
作为
x[N-1]
,这是不对的。如上所述使用
N-1
可以得到一个
N-1
元素数组,这肯定不是我想要的,也不会以
1
结尾。我已经验证了
x.dtype
float64
,这与Matlab的表示法相同


如何在numpy中获得一个完全对称的数组,就像我在Matlab中使用的那样?

您给出的Python代码是不等价的,因为它被
N
除法,而不是
N-1

octave:1> N=1024;
octave:2> X=1;
octave:3> dx=2*X/(N-1);
octave:4> dx
dx =  0.0019550
vs

所以你会得到不同的答案也就不足为奇了。现在,为了得到与Matlab相同的结果,您可以


但实际上,使用
linspace
,这就是它的用途,而且它对于其他人查看您的代码来说更具可读性。

这与
linspace(-1,1,1024)
(两者都适用)有何不同?@larsmans问得好。我看不出他们有什么不同的理由,但他们是(至少在numpy方面是如此)。我更习惯于不使用
linspace
,我想每个人都有自己的选择。如果N是您的输入,
linspace
是要使用的“正确”函数。(“correct”在引号中,因为实际上,你可以做任何你想做的事情,但这正是
linspace
的目的。)当
step
是一个浮点数时,
r\u[start:stop:step]
相当于
numpy.arange(start,stop,step)
arange
类似于
range
的浮点版本——它不包括端点。由于正常的浮点不精确性,当计算端点时,这可能会引起意外,因此我通常坚持使用
linspace
(很抱歉出现了垃圾评论)。如果您真的想要
r\u
提供的紧凑表示法,您可以使用hackish
r\u[-X:X:N*1j]
,因为
步骤是纯虚构的,
r\u[start:stop:step]
相当于
linspace(start,stop,step.real)
。键是
r[-X:X+dx:dx]
中的
+dx
。我会看看是否能说服自己使用
linspace
,尽管
:-)
。小心
r[start:stop+dx:dx]
。数字的不精确性可能会导致意外。例如,
r[2.1:4.2+0.15:0.15]
在结果中包括
4.35
>>> N = 1024
>>> X = 1
>>> dx = 2. * X / N
>>> dx
0.001953125
>>> dx = 2. * X / (N - 1)
>>> x = r_[-X:X+dx:dx]
>>> x
array([-1.        , -0.99804497, -0.99608993, ...,  0.99608993,
        0.99804497,  1.        ])
>>> x.shape
(1024,)