2013-04-10 323 views
7

首先,對這兩個問題似乎有多明顯是道歉的;我對此非常非常新,並且不知道我在做什麼。Python'AttributeError:'function'object has no attribute'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無關,應該以超級用戶的身份詢問。 – 2013-04-10 15:46:24

+0

如果你從'scipy.interpolate import interp1d'執行'''',你可以簡單地調用'interp1d(...)'。如果你只有'scipy as sp',你必須把它叫做'sp.interpolate.interp1d(...)'你不需要這樣做,除非你想單獨調用'interp1d(...)'以及'scipy'像'sp.interp()'中的另一個函數,而不顯式地從scipy import interp'導入和'from scipy.interpolate import interp1d' – askewchan 2013-04-10 17:23:55

回答

2

更改該行:

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

minmax不是列表的屬性,他們是自己的功能。

+0

謝謝 - 修正了這個問題。我現在得到'TypeError:'函數'對象不可兼容'。 – 2013-04-10 15:53:26

+0

我想你想在'x1'上運行這個,因爲我不確定'x = var'是什麼意思。但'x1'是一個列表。 – 2013-04-10 15:56:22

-1

Int's沒有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 

我不知道什麼是varvar不是Python中的默認內建函數,但如果它是一個函數,那麼無論您是由於某種原因自己定義它,還是從某處(例如使用Sage,或者您做過明星導入如from sympy import *或其他東西)。

[更新:既然你說你是「使用PyLab」,可能varnumpy.var已在IPython啓動時導入到範圍內。我覺得你真的是在--pylab模式「下使用IPython的。]

也可以定義x1y1,但隨後你以後的代碼是指xy,所以它有點感覺這段代碼在兩個中途之間的功能狀態。

現在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變成一個變量,但是對於代碼的其餘部分來說實際上並沒有任何意義,所以我不確定爲什麼我這麼做了!非常感謝,非常感謝。 – 2013-04-10 16:04:21

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]: 
相關問題