Я выполняю первый кубический сплайн для 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: : проблема устранена, извините, нетбыл плохой отступ.
С уважением