"data type not understood" when converting Matlab code to Python

Question:

I am trying to convert the following code from Trefethen’s Spectral Methods in MATLAB to Python.

% p6.m - variable coefficient wave equation

% Grid, variable coefficient, and initial data:
  N = 128; h = 2*pi/N; x = h*(1:N); t = 0; dt = h/4;
  c = .2 + sin(x-1).^2;
  v = exp(-100*(x-1).^2); vold = exp(-100*(x-.2*dt-1).^2);

% Time-stepping by leap frog formula:
  tmax = 8; tplot = .15; clf, drawnow, set(gcf,'renderer','zbuffer')
  plotgap = round(tplot/dt); dt = tplot/plotgap;
  nplots = round(tmax/tplot);
  data = [v; zeros(nplots,N)]; tdata = t;
  for i = 1:nplots
    for n = 1:plotgap
      t = t+dt;
      v_hat = fft(v);
      w_hat = 1i*[0:N/2-1 0 -N/2+1:-1] .* v_hat;
      w = real(ifft(w_hat)); 
      vnew = vold - 2*dt*c.*w; vold = v; v = vnew;
    end
    data(i+1,:) = v; tdata = [tdata; t];
  end
  waterfall(x,tdata,data), view(10,70), colormap(1e-6*[1 1 1]);
  axis([0 2*pi 0 tmax 0 5]), ylabel t, zlabel u, grid off

For the most part it is going smoothly except for this line of code

 data = [v; zeros(nplots,N)]

After reading how to convert between Numpy and Matlab here Link I tried to convert it by doing the following

data = np.array(v,zeros(nplots,N))

but I get this error

 data = np.array(v,zeros(nplots,N));
 TypeError: data type not understood

Which I assume is because a numpy array has this structure

  numpy.array(object,dtype=none)

I would appreciate any help with converting that line. Thank you in advance!

Asked By: Stripers247

||

Answers:

data = [v; zeros(nplots,N)] this is concatenating two matrices and stacken them up, note the ; in numpy you can use numpy.concatenate((v, zeros((nplots,N))), axis = 0) where axis is by which axis you want to concatenate by …

data = np.array(v,zeros(nplots,N));
TypeError: data type not understood

basically when you call np.array the fist argument must be iterable object, list, tuple and on the second argument must be the type ie ‘int’, ‘float32’, ‘float32’ and so on … but you set the type to zeros(nplots,N) numpy is complaining that it isn’t a type …
numpy.zeros is the same the first argument must be a tuple and the second the type, sorry about that I didn’t properly include ()

it should be data = numpy.concatenate((v, numpy.zeros((nplots,N))), axis = 0) assuming that you want to use double type which is the standard type.

Answered By: Samy Vilar
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.