Проблема с 2 последовательными операциями кубического сплайна - PullRequest
0 голосов
/ 06 июня 2019

Я выполняю первый кубический сплайн для 2 столбцов данных (всего для 301 файла).Все работает нормально, диапазон значений равен ожидаемым.

Проблема возникает из-за второй операции кубической сплайн-интерполяции, выполняемой сразу после выполнения программы из исходного кода Python с os.system (который производитдругие файлы 301, которые я загружаю в kh, pk)

Действительно, я получаю следующую ошибку во второй операции кубического сплайна, вот ошибка:

Traceback (most recent call last):
File "Exe_launcher.py", line 323, in <module>
P_m = CubicSpline(np.log10(kh[ppp]),np.log10(pk[ppp]))
File "/Users/fab/Library/Python/2.7/lib/python/site-packages/scipy   /interpolate/_cubic.py", line 527, in __init__
axis = axis % y.ndim
ZeroDivisionError: integer division or modulo by zero

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

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

zrange = range(300)
while paramo < len(fid)+1:

   ## First cubic spline interpolation (paramo = 0)
  print('paramo_final1 = ', paramo)

  if paramo == 0:
   # Test_matterpower
   FPA = fold_path_fid
   aaa = len(zrange)
   while aaa >= 0:
       if aaa == len(zrange):
       kh, pk = np.loadtxt("test_matterpower"+str(aaa)+".dat", usecols=(0,1,), unpack=True)
       elif aaa > 0:
       kh1, pk1 = np.loadtxt("test_matterpower"+str(aaa)+".dat", usecols=(0,1,), unpack=True)
       kh = np.vstack((kh,kh1))
       pk = np.vstack((pk,pk1))
       else:
       kh1, pk1 = np.loadtxt("test_matterpower"+str(len(zrange)+1)+".dat", usecols=(0,1,), unpack=True)
       kh = np.vstack((kh,kh1))
       pk = np.vstack((pk,pk1))
       aaa = aaa-1

   ooo,ppp = 0,0
   integrale = np.zeros((len(pk)))
   print('1) len(kh) = ', len(kh))
   print('len(pk) = ', len(pk))
   print('len(integrale) = ', len(integrale))
   print('kh = ', kh)
   print('kh[0] = ', kh[0])
   print('np.log10(kh[ppp] = ', np.log10(kh[ppp]))
   print('np.log10(pk[ppp] = ', np.log10(pk[ppp]))
   print('pk = ', pk)
   while ppp < len(integrale):
       P_m = CubicSpline(np.log10(kh[ppp]),np.log10(pk[ppp]))
       while ooo < len(kh[0])-1:
       integrale[ppp] = integrale[ppp] + 1./(2*np.pi**2) * (kh[ppp][ooo+1]-kh[ppp][ooo])/6. * ( (kh[ppp][ooo]**2*(3*(np.sin(8*kh[ppp][ooo]) - 8*kh[ppp][ooo]*np.cos(8*kh[ppp][ooo]))/(8*kh[ppp][ooo])**3)**2*pk[ppp][ooo]) + (kh[ppp][ooo+1]**2*(3*(np.sin(8*kh[ppp][ooo+1]) - 8*kh[ppp][ooo+1]*np.cos(8*kh[ppp][ooo+1]))/(8*kh[ppp][ooo+1])**3)**2*pk[ppp][ooo+1]) + 4.*( ((kh[ppp][ooo+1]+kh[ppp][ooo])/2.)**2*(3*(np.sin(8*(kh[ppp][ooo+1]+kh[ppp][ooo])/2.) - 8*(kh[ppp][ooo+1]+kh[ppp][ooo])/2*np.cos(8*(kh[ppp][ooo+1]+kh[ppp][ooo])/2.))/(8*(kh[ppp][ooo+1]+kh[ppp][ooo])/2.)**3)**2*10**P_m(np.log10((kh[ppp][ooo]+kh[ppp][ooo+1])/2))) )
       ooo=ooo+1
       ooo=0
       ppp=ppp+1

   print('1) kh[0] = ', kh[0])
   kh = np.delete(kh, len(kh)-1, axis=0)
   pk = np.delete(pk, len(pk)-1, axis=0)
   print('2) kh[0] = ', kh[0])

  # for paramo > 0 
  else: 

   ## Second cubic spline interpolation (paramo > 0)

     os.system('./camb Exe_launcher_modified.ini')   

     aaa = len(zrange)
     while aaa >= 0:
      if aaa == len(zrange):
          kh, pk = np.loadtxt("test_matterpower"+str(aaa)+".dat", usecols=(0,1,), unpack=True)
      elif aaa > 0:
          kh1, pk1 = np.loadtxt("test_matterpower"+str(aaa)+".dat", usecols=(0,1,), unpack=True)
          kh = np.vstack((kh,kh1))
          pk = np.vstack((pk,pk1))
      else:
          kh1, pk1 = np.loadtxt("test_matterpower"+str(len(zrange)+1)+".dat", usecols=(0,1,), unpack=True)
          kh = np.vstack((kh,kh1))
          pk = np.vstack((pk,pk1))
      aaa = aaa-1

      ooo,ppp = 0,0
      integrale = np.zeros((len(pk)))
      print('2) len(kh) = ', len(kh))
      print('len(pk) = ', len(pk))
      print('len(integrale) = ', len(integrale))
      print('kh = ', kh)
      print('kh[0] = ', kh[0])
      print('np.log10(kh[ppp] = ', np.log10(kh[ppp]))
      print('np.log10(pk[ppp] = ', np.log10(pk[ppp]))
      print('pk = ', pk)
      while ppp < len(integrale):
          P_m = CubicSpline(np.log10(kh[ppp]),np.log10(pk[ppp]))
          while ooo < len(kh[0])-1:
          integrale[ppp] = integrale[ppp] + 1./(2*np.pi**2) * (kh[ppp][ooo+1]-kh[ppp][ooo])/6. * ( (kh[ppp][ooo]**2*(3*(np.sin(8*kh[ppp][ooo]) - 8*kh[ppp][ooo]*np.cos(8*kh[ppp][ooo]))/(8*kh[ppp][ooo])**3)**2*pk[ppp][ooo]) + (kh[ppp][ooo+1]**2*(3*(np.sin(8*kh[ppp][ooo+1]) - 8*kh[ppp][ooo+1]*np.cos(8*kh[ppp][ooo+1]))/(8*kh[ppp][ooo+1])**3)**2*pk[ppp][ooo+1]) + 4.*( ((kh[ppp][ooo+1]+kh[ppp][ooo])/2.)**2*(3*(np.sin(8*(kh[ppp][ooo+1]+kh[ppp][ooo])/2.) - 8*(kh[ppp][ooo+1]+kh[ppp][ooo])/2*np.cos(8*(kh[ppp][ooo+1]+kh[ppp][ooo])/2.))/(8*(kh[ppp][ooo+1]+kh[ppp][ooo])/2.)**3)**2*10**P_m(np.log10((kh[ppp][ooo]+kh[ppp][ooo+1])/2))) )
          ooo=ooo+1
          ooo=0
          ppp=ppp+1

     print('3) kh[0] = ', kh[0])
     kh = np.delete(kh, len(kh)-1, axis=0)
     pk = np.delete(pk, len(pk)-1, axis=0)

     print('4) kh[0] = ', kh[0])

При выполнении достигается первая кубическая интерполяция, но не вторая:

Traceback (most recent call last):
File "Exe_launcher.py", line 323, in <module>
P_m = CubicSpline(np.log10(kh[ppp]),np.log10(pk[ppp]))
File "/Users/fab/Library/Python/2.7/lib/python/site-packages/scipy   /interpolate/_cubic.py", line 527, in __init__
axis = axis % y.ndim
ZeroDivisionError: integer division or modulo by zero

ОБНОВЛЕНИЕ 1: : проблема устранена, извините, нетбыл плохой отступ.

С уважением

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