AttributeError: модуль «scipy.interpolate» не имеет атрибута «сплайн»

Я использую Python 3.6 и пытаюсь запустить следующий код из здесь:

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate

x = np.array([ 2.,  1.,  1.,  2.,  2.,  4.,  4.,  3.])
y = np.array([ 1.,  2.,  3.,  4.,  2.,  3.,  2.,  1.])
plt.plot(x,y, label='poly')

t = np.arange(x.shape[0], dtype=float)
t /= t[-1]
nt = np.linspace(0, 1, 100)
x1 = scipy.interpolate.spline(t, x, nt)
y1 = scipy.interpolate.spline(t, y, nt)
plt.plot(x1, y1, label='range_spline')

t = np.zeros(x.shape)
t[1:] = np.sqrt((x[1:] - x[:-1])**2 + (y[1:] - y[:-1])**2)
t = np.cumsum(t)
t /= t[-1]
x2 = scipy.interpolate.spline(t, x, nt)
y2 = scipy.interpolate.spline(t, y, nt)
plt.plot(x2, y2, label='dist_spline')

plt.legend(loc='best')
plt.show()

Но выдает ошибку AttributeError: module 'scipy.interpolate' has no attribute 'spline'.

Затем я изменяю следующее, импортируя make_interp_spline из scipy.interpolate:

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate
from scipy.interpolate import make_interp_spline

x = np.array([ 2.,  1.,  1.,  2.,  2.,  4.,  4.,  3.])
y = np.array([ 1.,  2.,  3.,  4.,  2.,  3.,  2.,  1.])
plt.plot(x,y, label='poly')

t = np.arange(x.shape[0], dtype=float)
t /= t[-1]
nt = np.linspace(0, 1, 100)
x1 = make_interp_spline(t, x, nt)
y1 = make_interp_spline(t, y, nt)
plt.plot(x1, y1, label='range_spline')

t = np.zeros(x.shape)
t[1:] = np.sqrt((x[1:] - x[:-1])**2 + (y[1:] - y[:-1])**2)
t = np.cumsum(t)
t /= t[-1]
x2 = make_interp_spline(t, x, nt)
y2 = make_interp_spline(t, y, nt)
plt.plot(x2, y2, label='dist_spline')

plt.legend(loc='best')
plt.show()

Я получаю новую ошибку ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all().

Вне:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-2b54020d8fb1> in <module>
     12 t /= t[-1]
     13 nt = np.linspace(0, 1, 100)
---> 14 x1 = make_interp_spline(t, x, nt)
     15 y1 = make_interp_spline(t, y, nt)
     16 plt.plot(x1, y1, label='range_spline')

/usr/local/lib/python3.7/site-packages/scipy/interpolate/_bsplines.py in make_interp_spline(x, y, k, t, bc_type, axis, check_finite)
    751 
    752     # special-case k=0 right away
--> 753     if k == 0:
    754         if any(_ is not None for _ in (t, deriv_l, deriv_r)):
    755             raise ValueError("Too much info for k=0: t and bc_type can only "

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Просто интересно, как решить эту проблему? Спасибо.


person ah bon    schedule 04.03.2020    source источник
comment
Пожалуйста, покажите, откуда именно появляется последняя ошибка ValueError.   -  person ev-br    schedule 07.03.2020
comment
Я добавляю полный ValueError, пожалуйста, проверьте.   -  person ah bon    schedule 08.03.2020
comment
Хорошо, тогда понятно, смотрите мой ответ   -  person ev-br    schedule 08.03.2020


Ответы (1)


Третий аргумент make_interp_spline — это порядок сплайнов (т. е. 3 для кубических сплайнов), и вы вызываете его с помощью массива nt.

Если вы хотите указать свои собственные узлы, используйте параметр t=... kwarg.

person ev-br    schedule 07.03.2020
comment
Извините, я не понимаю. Можете ли вы запустить код и отобразить результаты? Спасибо. - person ah bon; 08.03.2020