2013-04-10 20 views
7

Po pierwsze, przepraszam za oczywistość tych dwóch pytań; Jestem bardzo nowy i nie mam pojęcia, co robię.Python 'AttributeError: obiekt' function 'nie ma atrybutu' min ''

Próbuję napisać coś, aby zastosować funkcję Scipy do interpolacji splajnu do tablicy wartości. Mój kod aktualnie wygląda tak:

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) 

ale gdy dostaje się do linii

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

pojawia się następujący błąd:

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

i tak daleko googlowania itp okazało się nic to rozumiem. Co to oznacza i jak mogę to naprawić?

Drugie pytanie: jak mogę wprowadzić więcej niż jedną linię kodu naraz? W tej chwili, jeśli próbuję skopiować całą rzecz, a następnie wkleić ją do PyLab, wprowadza ona tylko górną linię mojego kodu, więc muszę wkleić całą rzecz w jednym wierszu na raz. Jak to obejść?

+3

spróbuj zachować pytania tylko jedno pytanie, pierwszym (programowanie) pytanie jest dopuszczalne na tej stronie, jednak swoje drugie (nieprogramowe) pytanie nie ma nic wspólnego z StackOverflow i powinno być zadawane przez Superuser. –

+0

Jeśli zrobisz 'from scipy.interpolate import interp1d' możesz po prostu wywołać' interp1d (...) '. Jeśli posiadasz 'tylko' scipy as sp' musisz nazwać go 'sp.interpolate.interp1d (...)' Nie musisz wykonywać obu, chyba że chcesz wywołać 'interp1d (...)' sam a także inna funkcja z 'scipy' jak' sp.interp() 'bez bezpośredniego importowania' od scipy import interp' i 'from scipy.interpolate import interp1d' – askewchan

Odpowiedz

2

Zmiana tej linii do:

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

min i max nie są atrybutami listach, są one ich własne funkcje.

+0

Dzięki - poprawiono to. Teraz otrzymuję "TypeError:" funkcja "object is interable". –

+0

Myślę, że chcesz uruchomić to na 'x1', ponieważ nie jestem pewien, co oznacza' x = var'. ale 'x1' jest listą. –

-1

Int's nie mają funkcji min(), ale min() jest wbudowaną funkcją. Musisz użyć min (x).

8

Jeśli ta linia

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

generuje komunikat o błędzie

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

następnie x jest funkcją, a funkcje (w ogóle) nie mają min atrybuty, więc nie można zadzwoń pod numer some_function.min(). Co to jest x? W kodzie, masz tylko zdefiniowane jako

x=var 

Nie jestem pewien, co var jest. var nie jest domyślnie wbudowany w Pythonie, ale jeśli jest to funkcja, to albo sam ją zdefiniowałeś z jakiegoś powodu, albo skądś ją wybrałeś (powiedzmy, że używasz Sage'a lub importujesz gwiazdkę jak from sympy import * lub coś)

[Aktualizacja:., ponieważ można powiedzieć, że jesteś „za pomocą PyLab”, prawdopodobnie var jest numpy.var który został przywieziony do zakresu przy starcie w ipython. Myślę, że naprawdę znaczy „za pomocą ipython w trybie --pylab.]

również zdefiniować x1 i y1, ale wówczas późniejsze Kod odnosi się do x i y, więc to rodzaj czuje się jak ten kod jest w połowie drogi między dwa stany funkcjonalne.

Teraz numpy tablice zrobić mieć metodę .min() i .max(), więc tak:

>>> 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) 

będzie działać. Twoje dane testowe nie będzie, ponieważ interpolacja potrzebuje co najmniej 4 punkty, a chcesz uzyskać

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

Fantastyczne - wszystko poszło dobrze, nie dając mi żadnych komunikatów o błędach. Z x = var próbowałem przekształcić x w zmienną, ale to nie ma sensu w odniesieniu do reszty kodu, więc nie jestem pewien, dlaczego to robiłem! Wielkie dzięki, bardzo doceniane. –

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?

Zakładając, że jesteś w ipython zwanej jako ipython --pylab lub coś podobnego, to można po prostu użyć the paste magic command. Nazwij to jak %paste lub po prostu paste jeśli nie zostały zdefiniowane jako paste innej zmiennej:

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]: 
Powiązane problemy