Циклический вывод в список или массив NumPy, также NoneTypeError - PullRequest
0 голосов
/ 16 ноября 2018

Вот мой код:

# Libs
import numpy as np

# Isostatic model:

def airy(t,tref=35.,rhoM=3.2,rhoC=2.7,mode=None,rate=None,hlimit=None):
  # Equilibrium ratios:
  er = rhoC / (rhoM-rhoC)
  di = rhoC/rhoM
  # Static buoyancy equation:
  excess = t-tref
  hi = excess * (1-di)
  ri = excess - hi  
  # Mode results:
  if mode == 'Initial':
    print("Model parameters: Crustal density =",rhoC,"Mantle density =",rhoM)
    print("Mountain height (Km) =",np.round(hi, 3))
    print("Root thickness (Km) =",np.round(ri, 3))
    print("Ratio of height to root =",er)
    return ri, hi
  elif mode=='Erosive':
    # Initialise loop
    counter = 0
    ht = hi
    while ht >= hlimit:
      counter = counter+1
      excess = t-tref
      ht = excess * (1-di)
      rt = excess - ht
      ht = ht*np.exp(rate*counter)
      t = ht+rt+tref
      print(rt, ht, counter)
  elif mode==None:
    return ri, hi

tref = 35.  
it = tref*1.5
print("Initial thickness =",it)
ir, ih = airy(it, mode='Initial')
rt, ht, tstep = airy(it, mode='Erosive', rate=-0.025,hlimit=0.5)

Мне потребовалось много времени, чтобы дойти до этой стадии с помощью цикла, и я все еще не тот, кто мне нужен!

Я хотел бы получить список или массив значений для каждой итерации цикла для переменных rt и ht.На данный момент это работает и печатает правильные значения для цикла, но также приводит к ошибке NoneTypeError.Если я добавлю return rt, ht, counter, то результатом будет одно значение, а не список / массив.

Итак, я видел этот ответ, но в идеале хочу, чтобы это было внутри одной функции, и я не могу видеть, где я должен использовать список в цикле.

Любая помощь будет оценена!Спасибо

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018
    elif mode=='Erosive':
        # Initialise loop
        counter = 0
        ht = hi
        while ht >= hlimit:
          counter = counter+1
          excess = t-tref
          ht = excess * (1-di)
          rt = excess - ht
          ht = ht*np.exp(rate*counter)
          t = ht+rt+tref
          print(rt, ht, counter)
#-------> where is a return statement?
0 голосов
/ 16 ноября 2018

Вы забыли вернуть трехзначный кортеж:

def airy(t,tref=35.,rhoM=3.2,rhoC=2.7,mode=None,rate=None,hlimit=None):
  # Equilibrium ratios:
  er = rhoC / (rhoM-rhoC)
  di = rhoC/rhoM
  # Static buoyancy equation:
  excess = t-tref
  hi = excess * (1-di)
  ri = excess - hi  
  # Mode results:
  if mode == 'Initial':
    print("Model parameters: Crustal density =",rhoC,"Mantle density =",rhoM)
    print("Mountain height (Km) =",np.round(hi, 3))
    print("Root thickness (Km) =",np.round(ri, 3))
    print("Ratio of height to root =",er)
    return ri, hi
  elif mode=='Erosive':
    # Initialise loop
    counter = 0
    ht = hi
    l_ht = []
    l_rt_ = []
    l_counter = []
    while ht >= hlimit:
      counter = counter+1
      excess = t-tref
      ht = excess * (1-di)
      rt = excess - ht
      ht = ht*np.exp(rate*counter)
      t = ht+rt+tref
      print(rt, ht, counter)
      l_rt.append(rt)
      l_ht.append(ht)
      l_counter .append(counter)
    return l_rt, l_ht, l_counter # HERE
  elif mode==None:
    return ri, hi

В противном случае вернет None и потерпит неудачу при распаковке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...