Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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
将MATLAB代码转换为Python并收到TypeError:';numpy.ndarray和#x27;对象不可调用错误_Python_Python 3.x_Matlab_Numpy_Numpy Ndarray - Fatal编程技术网

将MATLAB代码转换为Python并收到TypeError:';numpy.ndarray和#x27;对象不可调用错误

将MATLAB代码转换为Python并收到TypeError:';numpy.ndarray和#x27;对象不可调用错误,python,python-3.x,matlab,numpy,numpy-ndarray,Python,Python 3.x,Matlab,Numpy,Numpy Ndarray,我正在将生成波形的MATLAB代码转换为Python。在上下文中,这是一个来自原子力显微镜的带激发响应的模拟(与代码错误无关)。下面是MATLAB代码 %simulate BE response over a line scan % define experimental parameters IO_rate = 4E6; %[samples/sec] N_pixels = 128; % number of pixels along a line scan N_points_per_pixel

我正在将生成波形的MATLAB代码转换为Python。在上下文中,这是一个来自原子力显微镜的带激发响应的模拟(与代码错误无关)。下面是MATLAB代码

%simulate BE response over a line scan

% define experimental parameters
IO_rate = 4E6; %[samples/sec]
N_pixels = 128; % number of pixels along a line scan
N_points_per_pixel = 2^13; % number of data points per pixel
w1 = 200E3; % lower edge of band
w2 = 400E3; % upper edge of band
noise_level = .1; %add noise to the signal

w_vec = -IO_rate/2: IO_rate/N_points_per_pixel : IO_rate/2-IO_rate/N_points_per_pixel; %frequency vector over a pixel

% vary A, wo, Q, and phase over pixels
p_vec = (0:N_pixels-1)/N_pixels;
A_vec = sin(2*pi*3*p_vec)+2; %amplitude
wo_vec = 250E3 + 100E3*p_vec; %resonance
Q_vec = 100 - 50*p_vec; % Q-factor
phi_vec = sign(p_vec-.5); % phase

% build drive signal, define in the Fourier domain
D_vec = zeros(size(w_vec));
D_vec( ((abs(w_vec)<w2) + (abs(w_vec)>w1)) == 2 ) = 1; % drive bins located within upper and lower band edges
band_ind = find( (((w_vec)<w2) + ((w_vec)>w1)) == 2 );

d_vec = fftshift(ifft(ifftshift(D_vec))); % find drive signal in the time domain

% build response at each pixel
R_mat = zeros(N_pixels,N_points_per_pixel);
r_mat = zeros(N_pixels,N_points_per_pixel);
for k1 = 1 : N_pixels
    H_vec = (A_vec(k1).*wo_vec(k1).^2).*exp(1i*phi_vec(k1))./(w_vec.^2 + 1i*wo_vec(k1)*w_vec/Q_vec(k1) - wo_vec(k1).^2); %cantilever transfer function
    R_mat(k1,:) = (H_vec.*D_vec); %response of the cantilever in the Fourier domain
    
    %determine response in the time domain (this is a little hokey, but it should work for simulation)    
    r_mat(k1,:) = fliplr((real((ifft(fftshift(R_mat(k1,:)))))));    
end

% build full response in the time domain;
r_vec = reshape(r_mat.',[ 1 N_pixels*N_points_per_pixel]);

% add noise
r_vec = r_vec + noise_level*2*(rand(size(r_vec))-.5);

%save response as a .mat (which can be read into python if needed)
%模拟行扫描上的BE响应
%定义实验参数
IO_比率=4E6;%[样本/秒]
N_像素=128;%沿线扫描的像素数
每像素N个点=2^13;%每像素的数据点数量
w1=200E3;%带的下边缘
w2=400E3;%带的上边缘
噪音水平=.1;%给信号加上噪音
w_vec=-IO_速率/2:IO_速率/N_点数/u像素:IO_速率/2-IO_速率/N_点数/u像素;%像素上的频率向量
%在像素上改变A、wo、Q和相位
p_向量=(0:N_像素-1)/N_像素;
A_vec=sin(2*pi*3*p_vec)+2;%振幅
wo_vec=250E3+100E3*p_vec;%共鸣
Q_vec=100-50*p_vec;%Q因子
phi_vec=符号(p_vec-.5);%阶段
%建立驱动信号,在傅里叶域中定义
D_vec=零(大小(w_vec));
D_vec(((abs(w_vec)w1))==2)=1;%位于上部和下部带边缘内的传动箱
波段ind=find(((w_vec)w1))=2;
d_vec=fft移位(ifft(ifftshift(d_vec));%在时域中查找驱动信号
%在每个像素处构建响应
R_mat=零(N_像素,N_点/u像素);
r_mat=零(N_像素,N_点/u像素);
对于k1=1:N_像素
H_-vec=(A_-vec(k1).*w_-vec(k1).^2.*exp(1i*phi_-vec(k1))/(w_-vec.^2+1i*w_-vec(k1)*w_-vec/Q_-vec(k1)-w_-vec(k1);%悬臂梁传递函数
R_-mat(k1,:)=(H_-vec.*D_-vec);%悬臂梁在傅里叶域中的响应
%在时域中确定响应(这有点胡闹,但它应该适用于模拟)
r_-mat(k1,:)=fliplr(real((ifft(fftshift)(r_-mat(k1,:)))));
结束
%在时域中建立完全响应;
r_vec=重塑(r_mat.,[1个N_像素*每个N像素N个点];
%增加噪音
r_vec=r_vec+噪声级*2*(rand(大小(r_vec))-.5);
%将响应另存为.mat(如果需要,可以将其读入python)
到目前为止,我已经将其转换为python代码

#simulate BE response over a line scan

# define experimental parameters
IO_rate = 4E6; #[samples/sec]
N_pixels = 128; # number of pixels along a line scan
N_points_per_pixel = 8192; # number of data points per pixel
w1 = 200E3; # lower edge of band
w2 = 400E3; # upper edge of band
noise_level = .1; #add noise to the signal

w_vec = np.arange(-IO_rate/2, IO_rate/2-IO_rate/N_points_per_pixel + 1, IO_rate/N_points_per_pixel)
# vary A, wo, Q, and phase over pixels
p_vec = np.arange(0, N_pixels-1)/N_pixels
A_vec = np.sin(2*np.pi*3*p_vec)+2 #amplitude
wo_vec = 250E3 + 100E3*p_vec #resonance
Q_vec = 100 - 50*p_vec # Q-factor
phi_vec = np.sign(p_vec-.5) # phase

D_vec = np.zeros(np.size(w_vec))
ind = (abs(w_vec)<w2) & (abs(w_vec)>w1);
D_vec[ind] = 1; #assign those indices to 1.
band_ind = np.nonzero(((w_vec)<w2) & ((w_vec)>w1));

d_vec = np.fft.fftshift(np.fft.ifft(np.fft.ifftshift(D_vec))) #find drive signal in the time domain
R_mat = np.zeros((N_pixels,N_points_per_pixel))
r_mat = np.zeros((N_pixels,N_points_per_pixel))

for k1 in range(N_pixels):
    H_vec = ((A_vec(k1)*wo_vec(k1)**2)*np.exp(1j*phi_vec(k1))/(w_vec**2 + 1j*wo_vec(k1)*w_vec/Q_vec(k1) - wo_vec(k1)**2)); #cantilever transfer function
#通过行扫描模拟BE响应
#定义实验参数
IO_率=4E6#[样本/秒]
N_像素=128;#沿线扫描的像素数
N_点每_像素=8192;#每像素的数据点数量
w1=200E3;#带的下边缘
w2=400E3;#带的上边缘
噪音水平=.1#给信号加上噪音
w_vec=np.arange(-IO_速率/2,IO_速率/2-IO_速率/N点/像素+1,IO_速率/N点/像素)
#在像素上改变A、wo、Q和相位
p_vec=np.arange(0,N_像素-1)/N_像素
A_vec=np.sin(2*np.pi*3*p_vec)+2#振幅
wo_vec=250E3+100E3*p_vec共振
Q#u vec=100-50*p#u vec#Q因子
phi_vec=np.符号(p_vec-.5)#相位
D_向量=np.零(np.大小(w_向量))
ind=(abs(w_vec)w1);
D_vec[ind]=1#将这些索引分配给1。
band_ind=np.非零((w_vec)w1));
d#u vec=np.fft.fft移位(np.fft.ifft(np.fft.ifftshift(d#vec)))#在时域中查找驱动信号
R_mat=np.零((N_像素,N_点/u像素))
r_mat=np.零((N_像素,N_点/u像素))
对于范围内的k1(N_像素):
H_vec=((A_vec(k1)*wo_vec(k1)**2)*np.exp(1j*phi_vec(k1))/(w_vec**2+1j*wo_vec(k1)*w_vec/Q_vec(k1)-wo_vec(k1)**2))#悬臂梁传递函数

执行for循环中到目前为止的内容后,我得到了
TypeError:'numpy.ndarray'对象不可调用
,因此我不确定我做错了什么?

这个问题存在于循环中向量的索引中。
代码应为:

    H_vec = ((A_vec[k1]*wo_vec[k1]**2)*np.exp(1j*phi_vec[k1])/(w_vec**2 + 1j*wo_vec[k1]*w_vec/Q_vec[k1] - wo_vec[k1]**2)); #cantilever transfer function
此外,似乎还有一个循环中的问题。 你的意思是写:

for k1 in range(N_pixels-1):
      
  • 原因是您使用
    ()
    操作符而不是
    []
    来访问数组中的项(即,您使用MatLab样式的元素引用而不是Phytonian样式)
  • 另外,在
    np.arrange()
    中,您应该传递N_个像素,否则您将得到一个
    索引器:索引127超出轴0的范围,大小为127
    错误
  • 由于Python使用缩进作为行之间的分隔,因此不需要添加
    位于每行末尾
  • 以下是更正的版本:

    import numpy as np
    #simulate BE response over a line scan
    
    # define experimental parameters
    IO_rate = 4E6 #[samples/sec]
    N_pixels = 128 # number of pixels along a line scan
    N_points_per_pixel = 8192 # number of data points per pixel
    w1 = 200E3 # lower edge of band
    w2 = 400E3 # upper edge of band
    noise_level = .1 #add noise to the signal
    
    w_vec = np.arange(-IO_rate/2, IO_rate/2-IO_rate/N_points_per_pixel + 1, 
    IO_rate/N_points_per_pixel)
    # vary A, wo, Q, and phase over pixels
    p_vec = np.arange(N_pixels)/N_pixels
    A_vec = np.sin(2*np.pi*3*p_vec)+2 #amplitude
    wo_vec = 250E3 + 100E3*p_vec #resonance
    Q_vec = 100 - 50*p_vec # Q-factor
    phi_vec = np.sign(p_vec-.5) # phase
    
    D_vec = np.zeros(np.size(w_vec))
    ind = (abs(w_vec)<w2) & (abs(w_vec)>w1)
    D_vec[ind] = 1; #assign those indices to 1.
    band_ind = np.nonzero(((w_vec)<w2) & ((w_vec)>w1))
    
    d_vec = np.fft.fftshift(np.fft.ifft(np.fft.ifftshift(D_vec))) #find drive signal in the time domain
    R_mat = np.zeros((N_pixels,N_points_per_pixel))
    r_mat = np.zeros((N_pixels,N_points_per_pixel))
    
    for k1 in range(N_pixels):
        H_vec = ((A_vec[k1]*wo_vec[k1]**2)*np.exp(1j*phi_vec[k1])/(w_vec**2 + 1j*wo_vec[k1]*w_vec/Q_vec[k1] - wo_vec[k1]**2)) #cantilever transfer function
    
    将numpy导入为np
    #通过线扫描模拟BE响应
    #定义实验参数
    IO_速率=4E6#[样本/秒]
    N_像素=128#沿线扫描的像素数
    N_点每_像素=8192#每像素的数据点数量
    w1=200E3#带的下边缘
    w2=400E3#带的上边缘
    噪声级=.1#向信号添加噪声
    w_vec=np.arange(-IO_rate/2,IO_rate/2-IO_rate/N_points_per_pixel+1,
    IO_速率/N_点数(每像素)
    #在像素上改变A、wo、Q和相位
    p_vec=np.arange(N_像素)/N_像素
    A_vec=np.sin(2*np.pi*3*p_vec)+2#振幅
    wo_vec=250E3+100E3*p_vec共振
    Q#u vec=100-50*p#u vec#Q因子
    phi_vec=np.符号(p_vec-.5)#相位
    D_向量=np.零(np.大小(w_向量))
    ind=(abs(w_vec)w1)
    D_vec[ind]=1#将这些索引分配给1。
    频带ind=np.非零((w_vec)w1))
    d#u vec=np.fft.fft移位(np.fft.ifft(np.fft.ifftshift(d#vec)))#在时域中查找驱动信号
    R_mat=np.零((N_像素,N_点/u像素))
    r_mat=np.零((N_像素,N_点/u像素))
    对于范围内的k1(N_像素):
    H_-vec=((A_-vec[k1]*wo_-vec[k1]**2)*np.exp(1j*phi_-vec[k1])/(w_-vec**2+1j*wo_-vec[k1]*w_-vec/Q_-vec[k1]**2))悬臂传递函数
    

    干杯。

    在索引方面,您了解MATLAB和python之间的区别吗?()与[]的用法?你知道什么是回溯吗?以及如何确定哪一行和变量是问题所在?为什么建议对除第一行和最后一行之外的所有元素执行OP循环?MATLAB代码在整个数组上循环。@CrisLuengo我如何编写它以使它在整个数组上循环?@RyanF:k1范围内(N_像素)的
    是正确的。