【问题标题】:Generating variables with a loop in Python from Matlab从 Matlab 在 Python 中使用循环生成变量
【发布时间】:2017-12-28 13:01:11
【问题描述】:

我正在尝试将程序从 Matlab 转换为 Python。

我在 Python 中写道:

age=np.arange(start_age, start_age+D, deltat)
For num in age:        
if age[:]<(65):
    Y=1
    break
else
    Y=0
    break
    break
H = (1/r) * (1 - math.exp(-r * max(0, (65 - age[:])))
A = ((1 - theta) * r - rho) / theta + 0.5 * ((1 - theta) / theta ** 2) *(    _lambda **2)
g = (1/A) * (math.exp(A * (D - (age[:] - start_age))) - 1)

我想要做的是:

  • 对于age,我需要一系列从 20 到 79 的整数;
  • 对于Y,我需要每个年龄值,
    • 对于小于 65 的数字,我需要 1 和
    • 对于每个大于或等于 65 的数字,我需要一个 0。
  • HAg 是简单的函数。

我有两个问题:

  1. 它不允许我使用 age 中的值。
  2. Y 的循环不起作用。

【问题讨论】:

  • 这段代码有很多问题。它没有正确缩进。它使用了几个未定义的变量。 for 应为小写。 else: 缺少一个冒号。为什么else 块中有2 个break 语句?此外,HAg 不是函数,它们是使用我之前提到的那些未定义变量的简单表达式赋值。

标签: python loops numpy for-loop if-statement


【解决方案1】:

听起来这就是你想要的ageY

In [314]: age = np.arange(20,80,5)
In [315]: Y = np.where(age<65, 1, 0)
In [316]: age
Out[316]: array([20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75])
In [317]: Y
Out[317]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0])

对于其余部分,我不会尝试测试代码(太多未定义的变量),但我认为这会起作用(对于标量参数):

H = (1/r) * (1 - np.exp(-r * max(0, (65 - age)))
A = ((1 - theta) * r - rho) / theta + 0.5 * ((1 - theta) / theta ** 2) * (_lambda **2)
g = (1/A) * (np.exp(A * (D - (age - start_age))) - 1)

math.exp 作用于标量值,np.exp 作用于数组。


测试有限:

In [318]: H = (1-np.exp(max(0, 65-age)))
----------------------------------------------------------------------
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

哎呀,错了max。那是 Python 标量:

In [319]: H = (1-np.exp(np.maximum(0, 65-age)))
In [320]: H
Out[320]: 
array([ -3.49342711e+19,  -2.35385267e+17,  -1.58601345e+15,
        -1.06864746e+13,  -7.20048993e+10,  -4.85165194e+08,
        -3.26901637e+06,  -2.20254658e+04,  -1.47413159e+02,
         0.00000000e+00,   0.00000000e+00,   0.00000000e+00])
In [321]: g = np.exp((1-(age-20)))
In [322]: g
Out[322]: 
array([  2.71828183e+00,   1.83156389e-02,   1.23409804e-04,
         8.31528719e-07,   5.60279644e-09,   3.77513454e-11,
         2.54366565e-13,   1.71390843e-15,   1.15482242e-17,
         7.78113224e-20,   5.24288566e-22,   3.53262857e-24])

【讨论】:

  • 谢谢!我仍在学习所有这些,我确实对 numpy 而不是 numpy 的不同功能感到困惑。谢谢!
【解决方案2】:

试试这个:

for num in age:
   if num < 65:
     Y=1
     break
   else:
     Y=0
     break
H = (1/r) * (1 - math.exp(-r * max(0, (65 - age[:])))
A = ((1 - theta) * r - rho) / theta + 0.5 * ((1 - theta) / theta ** 2) *(    
_lambda **2)
g = (1/A) * (math.exp(A * (D - (age[:] - start_age))) - 1)# equation (A11)

如果你像这样使用 for 循环,那么你可以使用列表中的每个元素用 num 代替 age!

但是:

你使用喙的方式,如果我弄错了,你总是会停在数组的第一个元素上并纠正我,但我认为这不是你想要的......所以或者你失去休息或你可以像这样检查第一个元素:

if age[0] < 65:

【讨论】:

    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2015-05-05
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多