Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 索引器错误:尝试在Matplotlib中打印时索引超出范围_Python_Matlab_Matplotlib - Fatal编程技术网

Python 索引器错误:尝试在Matplotlib中打印时索引超出范围

Python 索引器错误:尝试在Matplotlib中打印时索引超出范围,python,matlab,matplotlib,Python,Matlab,Matplotlib,我试图将以下代码从MATLAB中Trefethen的光谱方法转换为Python。但是遇到以下关于索引越界的错误。我对什么索引超出范围以及如何修复它感到有点困惑。任何帮助都将不胜感激 错误 我的代码 import numpy as np from numpy import * from math import pi from scipy.linalg import toeplitz from scipy.special import cotdg from mpl_toolkits.mplot3d

我试图将以下代码从MATLAB中Trefethen的光谱方法转换为Python。但是遇到以下关于索引越界的错误。我对什么索引超出范围以及如何修复它感到有点困惑。任何帮助都将不胜感激

错误

我的代码

import numpy as np
from numpy import *
from math import  pi
from scipy.linalg import toeplitz
from scipy.special import cotdg
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt


N = 512
h = (2*np.pi)/N
x = h*(np.arange(N)+1)
t = 0
dt = h/4.
a = .1
c = a + np.sin(x - 1)**2
v = np.exp(-100 * (x - 1)**2)
vold = np.exp(-100 * (x - a*dt - 1)**2)

column = ((0.5*(-1)**arange(N))*cotdg(arange(N))*(h/2));
D = toeplitz(column,-column);
#print(D.shape);


tmax = 15   
tplot = .15
plotgap = int(around(tplot/dt));print(plotgap)
dt = tplot/plotgap
nplots = int(round((tmax/tplot)));print(nplots)
k = np.zeros(((nplots,N))) 
data = np.concatenate((v.reshape((512,1)).transpose(), k))
tdata = t

for i in range(nplots):
    for n in range(plotgap):
        t = t+dt
        w = (D*v)
        vnew = vold-2*dt*c*w
        vold = v
        v = vnew
    data[i,:] = v[0,:]
    tdata = vstack([tdata, t])
print('shape data =',data.shape)
print('shape v =',v.shape)
print('shape tdata =',tdata.shape)
print('shape x =',x.shape)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(x,tdata,data,rstride=10, cstride=10)
plt.show()
python完成的数组形状

 shape data = (101, 512)
 shape tdata = (101, 1)
 shape x = (512,)
我让一个朋友在MatLab中运行size()命令来编写这段代码,他为数组设计了这些形状

data =  101 512
tdata = 101 1
x =     1   512
x and tdata

plot\u线框的前两个参数必须是2D数组

我不知道如何定制您的代码(因为代码太多),但我希望这能有所帮助


编辑:尝试查看有效输入的示例。

在matplotlib的帮助下-users@lists.sourceforge.net我想出来了。阵列

data =  101 512
tdata = 101 1
x =     1   512
x and tdata
需要广播,所以我做了

X,Y = np.broadcast_arrays(x,tdata)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X,Y,data,rstride=5, cstride=5)
plt.show()

我不太熟悉
matplotlib
scipy
numpy
的细节,但我猜您在从Matlab移植时引入了一些off-by-1错误,因为Matlab数组的索引是从
1
n
,而python数组的索引是从
0
n-1
。我希望这个评论真的有用!这是一个很好的观点,但它只适用于索引,而不适用于元素的总数——
shape
在numpy中和
size
在Matlab中应该返回相同的数字。我通过将Matlab代码中的
(1:N-1)
行设置为
arange(N)来考虑这一点)
在Python代码中。@SteveTjoa有没有办法将
形状=(512,)
更改为
(1512)
像Matlab输出一样?所以我需要一些方法来制作
x
二维数组?所以我做了
x,Y,Z=axes3d。获取测试数据(0.05)打印(x.shape)打印(Y.shape)打印(Y.shape)打印(Z.shape)
和获取
(120,120)(120,120)
这是否意味着数组的每个维度的长度必须相同?