2013-04-10 4 views
7

Во-первых, извинения за то, насколько очевидны эти два вопроса; Я очень новичок в этом и понятия не имею, что я делаю.Python 'AttributeError: объект' function 'не имеет атрибута' min ''

Я пытаюсь написать что-то, чтобы применить функцию Scipy для интерполяции сплайна к массиву значений. Мой код в настоящее время выглядит следующим образом:

import numpy as np 
import scipy as sp 
from scipy.interpolate import interp1d 

x=var 
x1 = ([0.1,0.3,0.4]) 
y1 = [0.2,0.5,0.6] 

new_length = 25 
new_x = np.linspace(x.min(), x.max(), new_length) 
new_y = sp.interpolate.interp1d(x, y, kind='cubic')(new_x) 

но когда дело доходит до линии

new_x = np.linspace(x.min(), x.max(), new_length) 

я получаю следующее сообщение об ошибке:

AttributeError: 'function' object has no attribute 'min' 

и до сих пор прибегая к помощи и т.д. не подвернулось ничего что я понимаю. Что это значит и как я могу это исправить?

Второй вопрос: как мне ввести сразу несколько строк кода? На данный момент, если я попытаюсь скопировать все это, а затем вставить его в PyLab, он вводит только верхнюю строку моего кода, поэтому мне нужно вставить все это в одну строку за раз. Как мне обойти это?

+3

Пожалуйста, попробуйте держать вопросы только один вопрос, ваш первый (программирование) вопрос является приемлемым на данном сайте, однако, ваш второй (не программируемый) вопрос не имеет ничего общего с StackOverflow и должен быть задан на Superuser. –

+0

Если вы используете 'from scipy.interpolate import interp1d', вы можете просто вызвать' interp1d (...) '. Если вы _only_ имеете 'import scipy as sp', вы должны называть его' sp.interpolate.interp1d (...) 'Вам не нужно делать оба, если вы не хотите вызывать' interp1d (...) 'самостоятельно а также другую функцию из 'scipy', например' sp.interp() 'без явного импорта 'из scipy import interp' и' из scipy.interpolate import interp1d' – askewchan

ответ

2

Изменение этой строки:

new_x = np.linspace(min(x), max(x), new_length) 

min и max не являются атрибутами списков, они являются их собственные функции.

+0

Спасибо - исправлено это. Теперь я получаю объект TypeError: 'function' не interable '. –

+0

Я думаю, вы хотите запустить это на 'x1', так как я не уверен, что означает' x = var'. но 'x1' - это список. –

-1

Int не имеет функции min(), но min() - встроенная функция. Вам нужно будет использовать min (x).

8

Если эта линия

new_x = np.linspace(x.min(), x.max(), new_length) 

генерирует сообщение об ошибке

AttributeError: 'function' object has no attribute 'min' 

затем x является функцией, а функции (в целом) не имеют min атрибуты, так что вы не можете позвоните по телефону some_function.min(). Что такое x? В вашем коде, вы только определили его как

x=var 

Я не уверен, что var есть. var не по умолчанию встроен в Python, но если это функция, то либо вы сами определили ее по какой-либо причине, либо вы ее выбрали откуда-то (скажем, вы используете Sage или вы импортировали звезду как from sympy import * или что-то)

[Update:., так как вы говорите, что вы «с помощью PyLab», вероятно, является varnumpy.var, который был импортирован в область видимости при запуске в IPython. Я думаю, что вы на самом деле означает «с помощью IPython в режиме --pylab.]

Вы также определить x1 и y1, но тогда ваш позже код относится к x и y, так что это своего рода чувство, что этот код находится на полпути между двумя функциональными состояниями.

numpy Теперь массивы сделать имеют .min() и .max() метод, так это:

>>> x = np.array([0.1, 0.3, 0.4, 0.7]) 
>>> y = np.array([0.2, 0.5, 0.6, 0.9]) 
>>> new_length = 25 
>>> new_x = np.linspace(x.min(), x.max(), new_length) 
>>> new_y = sp.interpolate.interp1d(x, y, kind='cubic')(new_x) 

будет работать. Данные испытаний не будет, так как интерполяция требуется по меньшей мере 4 очка, и вы получите

ValueError: x and y arrays must have at least 4 entries 
+0

Фантастический - все в порядке, без каких-либо сообщений об ошибках. С x = var я пытался превратить x в переменную, но на самом деле не имеет никакого смысла в отношении остальной части кода, поэтому я не уверен, почему я это делаю! Большое спасибо, очень благодарен. –

1

Second question: how do I input more than one line of code at once? At the moment, if I try to copy the whole thing and then paste it into PyLab, it only inputs the top line of my code, so I have to paste the whole thing in one line at a time. How do I get round this?

Предполагая, что вы находитесь в ipython называется ipython --pylab или что-то подобное, то вы можете просто использовать the paste magic command. Назовите это как %paste или просто paste, если вы не определили paste в другой переменной:

In [8]: paste 
import numpy as np 
import scipy as sp 
from scipy.interpolate import interp1d 

x=var 
x1 = ([0.1,0.3,0.4]) 
y1 = [0.2,0.5,0.6] 

new_length = 25 
new_x = np.linspace(x.min(), x.max(), new_length) 
new_y = sp.interpolate.interp1d(x, y, kind='cubic')(new_x) 

## -- End pasted text -- 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-8-b4e41f59d719> in <module>() 
     3 from scipy.interpolate import interp1d 
     4 
----> 5 x=var 
     6 x1 = ([0.1,0.3,0.4]) 
     7 y1 = [0.2,0.5,0.6] 

NameError: name 'var' is not defined 

In [9]: 
Смежные вопросы