【问题标题】:How to fix Range function in Python?如何在 Python 中修复 Range 函数?
【发布时间】:2019-08-23 10:45:48
【问题描述】:

我正在尝试将 MATLAB 代码转换为 Python,但遇到了与 Python 的 range 函数相关的错误。

整个代码可以在here 找到,我正在研究范围成像代码。

MATLAB 代码

Ts=(2*(Xc-X0))/c;        
Tf=(2*(Xc+X0))/c+Tp;     

n=2*ceil((.5*(Tf-Ts))/dt);   
t=Ts+(0:n-1)*dt;             
dw=pi2/(n*dt);               
w=wc+dw*(-n/2:n/2-1);        
x=Xc+.5*c*dt*(-n/2:n/2-1);                                
kx=(2*w)/c;

dt 的值是 2.500000000000000e-09n4268Ts1.300000000000000e-05

Python

Ts = (2 * (Xc - X0)) / c    
Tf = (2 * (Xc - X0)) / c + Tp

n = 2 * math.ceil((.5 * (Tf - Ts)) / dt)    
t = list(Ts + (np.array(range(0, n-1)) * dt))          # tried using the solution in the comments       
dw = pi2 / (n * dt)                 
w = list(wc + dw * (np.array(range(-n/2,n/2-1))))    # getting error here after trying same kind of solution    
x = Xc + .5 * c * dt * range(-n/2,n/2-1) 
kx=(2 * w) / c

Python 代码抛出以下错误:

TypeError: 'float' 对象不能被解释为整数

【问题讨论】:

  • 我不是 matlab 专家,但是在查看了 matlab 范围函数的 matlab 页面后,如果我理解它正确,它会返回某些东西的最小值和最大值?这是你想要达到的目标吗?
  • 请发布您的整个代码 sn-p。我想看看你是如何将值传递给n
  • matlab 中的代码为:n = 2*ceil((0.5*(Tf-Ts))/dt); t=Ts+(0:n-1)*dt;
  • 在 python 中尝试的代码为:n = 2 * math.ceil((.5 * (Tf - Ts)) / dt) t = Ts + (range(0,(n-1)) *dt)
  • @Svavelsyra 我正在尝试将 matlab 代码转换为 python。所以我尝试使用python的范围函数并在主要问题中出现上述错误

标签: python-3.x matlab


【解决方案1】:

由于您来自 Matlab,您很可能希望使用 numpy 进行向量/矩阵计算。 python 中的列表不能像 Matlab 中的数组那样相乘,但 numpy 数组可以。 range 会产生一个 range 对象,你可以将其转换为 numpy 数组,也可以直接使用numpy.arange

import numpy as np
import math

Ts = (2 * (Xc - X0)) / c    
Tf = (2 * (Xc - X0)) / c + Tp

n = 2 * math.ceil((.5 * (Tf - Ts)) / dt)      
t = Ts + np.arange(0, n*dt, dt)                  # np.arange(start, stop, step)

dw = pi2 / (n * dt)
w = wc + dw * np.arange(-n/2, n/2)           # not n/2-1 since stop is not included
x = Xc + 0.5 * c * dt * np.arange(-n/2, n/2)
kx = (2 * w) / c

在这种情况下,Matlab 和 Numpy 之间的区别在于,Matlab 将包含最后一个值(即区间 [start, stop]),而 numpy 不包含(即区间 [start,stop))。这意味着您必须将n*dt 用于stop 输入参数。

【讨论】:

  • 我已经编辑了我的主要问题,你解决这个问题了吗?
  • @Lokesh 查看更新,请不要进行从 rangenp.arrayslist 的奇怪转换,因为您可以通过首先创建 np.arrays 来避免这种情况,使用你可以做向量/矩阵乘法。
  • 使用 t = np.arange(Ts, n*dt, dt) 的解决方案,我将输出作为空数组而不是 1 和 308 之间的数字数组。所以你能帮忙吗我在这个问题上。提前致谢。
  • 我有一个问题,你可以在这里找到问题:stackoverflow.com/questions/57853113/…
【解决方案2】:

Python 中的range 函数返回一个range 对象,它本身就是一个列表。列表不能与十进制数相乘,这就是您要执行的操作:range(0,(n-1)) * dt

但您可以将范围列表转换为 numpy 数组:

t = list(Ts + (numpy.array(range(0, n-1)) * dt)) 

【讨论】:

  • 感谢您的解决方案。我尝试了下一行的解决方案 w = wc + dw * range(-n/2,n/2-1) as w = list(wc + dw * (np.array(range(-n/2,n/ 2-1)))) 但得到错误为“TypeError:'float'对象不能被解释为整数”
  • 我试过了 list(wc + dw * (np.array(range(-n/2,n/2-1)))) 对我来说很好用
猜你喜欢
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多