MATLAB到python的转换?由于数组的形状,python中出现错误

MATLAB到python的转换?由于数组的形状,python中出现错误,python,matlab,numpy,matplotlib,Python,Matlab,Numpy,Matplotlib,问题 下面给出了一条布朗运动矢量化路径,我正试图在python中复制它。我的问题是其中一个函数(以黄色突出显示为第一个函数)不工作。相反,它给了我一个错误(操作数无法与形状(1000499)(5001000))一起广播,因为添加了两个数组的尺寸 如何使用python重新创建数组U MATLAB代码来自,不是我自己的代码 MATLAB代码 Python尝试不起作用 错误消息 您不需要导入和使用mb.repmat。这在MATLAB中使用,因为它不做广播(或者至少直到最近才做)。要添加到(50010

问题

下面给出了一条布朗运动矢量化路径,我正试图在python中复制它。我的问题是其中一个函数(以黄色突出显示为第一个函数)不工作。相反,它给了我一个错误(
操作数无法与形状(1000499)(5001000)
)一起广播,因为添加了两个数组的尺寸

如何使用python重新创建数组
U

MATLAB代码来自,不是我自己的代码

MATLAB代码

Python尝试不起作用

错误消息


您不需要导入和使用
mb.repmat
。这在MATLAB中使用,因为它不做
广播
(或者至少直到最近才做)。要添加到(5001000)形状
W
t
需要是(500,),扩展到
(500,1)
。我建议使用
linspace
生成
t

测试:

np.arange
不包括终点,因此您的
t
仅为(499,)形状

===

MATLAB代码,以倍频程再现

>> T=1;N=500;dt=T/N;t=[dt:dt:1];
>> M=1000;
>> x=repmat(t,[M 1]);
>> W=randn(M,N);
>> Umean=mean(x+W);
t
is(1500)
x
W
是(1000500)大小,因此可以添加元素
Umean
是(1500)-第一维度上的平均值

numpy
代码:

In [1]: T = 1
   ...: N = 500
   ...: dt = float(T/N)
   ...: M = 1000 # ntraj
   ...: t = np.arange(dt,T,dt)
In [2]: t.shape
Out[2]: (499,)
In [3]: t = np.linspace(dt,T,N)
In [4]: t.shape
Out[4]: (500,)

In [6]: W=np.random.normal(0.0, 1.0, (N,M))
In [7]: W.shape
Out[7]: (500, 1000)

In [8]: (t[:,None]+W).shape
Out[8]: (500, 1000)
t[:,None]
是(500,1)形状,在不使用
repmat的情况下向(5001000)广播

要获得尺寸1000维上的
平均值
,我们必须使用:

In [9]: np.mean((t[:,None]+W), axis=1).shape
Out[9]: (500,)

您不需要导入和使用
mb.repmat
。这在MATLAB中使用,因为它不做
广播
(或者至少直到最近才做)。要添加到(5001000)形状
W
t
需要是(500,),扩展到
(500,1)
。我建议使用
linspace
生成
t

测试:

np.arange
不包括终点,因此您的
t
仅为(499,)形状

===

MATLAB代码,以倍频程再现

>> T=1;N=500;dt=T/N;t=[dt:dt:1];
>> M=1000;
>> x=repmat(t,[M 1]);
>> W=randn(M,N);
>> Umean=mean(x+W);
t
is(1500)
x
W
是(1000500)大小,因此可以添加元素
Umean
是(1500)-第一维度上的平均值

numpy
代码:

In [1]: T = 1
   ...: N = 500
   ...: dt = float(T/N)
   ...: M = 1000 # ntraj
   ...: t = np.arange(dt,T,dt)
In [2]: t.shape
Out[2]: (499,)
In [3]: t = np.linspace(dt,T,N)
In [4]: t.shape
Out[4]: (500,)

In [6]: W=np.random.normal(0.0, 1.0, (N,M))
In [7]: W.shape
Out[7]: (500, 1000)

In [8]: (t[:,None]+W).shape
Out[8]: (500, 1000)
t[:,None]
是(500,1)形状,在不使用
repmat的情况下向(5001000)广播

要获得尺寸1000维上的
平均值
,我们必须使用:

In [9]: np.mean((t[:,None]+W), axis=1).shape
Out[9]: (500,)

您好@wwii我已经阅读了文件,但我不明白这对解决问题有什么帮助。你能说得更清楚一点吗?这份文件解释了广播的规则。阵列形状需要与正在执行的操作兼容。如果您理解所编写的matlab代码,那么在学习了一些numpy基础知识之后,您应该能够用numpy创建一个函数等价物——这首先要花一些时间学习numpy文档。不幸的是,我受到了matlab的挑战。谢谢@wwii我现在会尝试解决这个问题。在matlab代码中,你能告诉我们每个元素的形状吗?它会相对容易地指出错误。我已经阅读了文件,但我不明白这对解决问题有什么帮助。你能说得更清楚一点吗?这份文件解释了广播的规则。阵列形状需要与正在执行的操作兼容。如果您理解所编写的matlab代码,那么在学习了一些numpy基础知识之后,您应该能够用numpy创建一个函数等价物——这首先要花一些时间学习numpy文档。不幸的是,我受到了matlab的挑战。谢谢@wwii我现在会尝试解决这个问题。在matlab代码中,你能告诉我们每个元素的形状吗?它将相对容易地将错误指向anks@hpaulj。我看到t是(500,1),这不是(500,1000)吗,其中1000代表M?当我运行这个函数时,生成的Umean是非线性的,但是当你绘制它时,Umean应该是一条倾斜的线,而不是一条有很多噪音的线。函数元素是这样的:U[I,j]=np.exp(t+0.5*W[I]),我添加了一些倍频程和
numpy
代码,希望能澄清这两个维度。几年前,我了解到,在MATLAB中,80%的调试工作都是为了得到正确的形状。不要猜测;测试和验证。谢谢@hpaulj。我看到t是(500,1),这不是(500,1000)吗,其中1000代表M?当我运行这个函数时,生成的Umean是非线性的,但是当你绘制它时,Umean应该是一条倾斜的线,而不是一条有很多噪音的线。函数元素是这样的:U[I,j]=np.exp(t+0.5*W[I]),我添加了一些倍频程和
numpy
代码,希望能澄清这两个维度。几年前,我了解到,在MATLAB中,80%的调试工作都是为了得到正确的形状。不要猜测;测试和验证。