2012-12-10 23 views
7

मूल फ़ंक्शन का मूल्यांकन करने के लिए पाइथन में कुछ कोड लिखना। मैं कुछ मूल्यों के साथ एक 2d सरणी मिल गया है और मैं उन मूल्यों से प्रत्येक के लिए समारोह लागू करते हैं और एक नया 2 डी सरणी प्राप्त करना चाहते हैं:टाइप एरर: 'फ़ंक्शन' ऑब्जेक्ट में कोई विशेषता नहीं है '__getitem__'

import numpy as N 
def makeGrid(dim): 
    ''' Function to return a grid of distances from the centre of an array. 
    This version uses loops to fill the array and is thus slow.''' 
    tabx = N.arange(dim) - float(dim/2.0) + 0.5 
    taby = N.arange(dim) - float(dim/2.0) + 0.5 
    grid = N.zeros((dim,dim), dtype='float') 
    for y in range(dim): 
     for x in range(dim): 
      grid[y,x] = N.sqrt(tabx[x]**2 + taby[y]**2) 
    return grid 

import math 

def BigGrid(dim): 
    l= float(raw_input('Enter a value for lambda: ')) 
    p= float(raw_input('Enter a value for phi: ')) 
    a = makeGrid 
    b= N.zeros ((10,10),dtype=float) #Create an array to take the returned values 
    for i in range(10): 
     for j in range (10): 
      b[i][j] = a[i][j]*l*p 
    return b 


if __name__ == "__main__": 
    ''' Module test code ''' 
    size = 10 #Dimension of the array 
    newGrid = BigGrid(size) 
    newGrid = N.round(newGrid, decimals=2) 
    print newGrid 

लेकिन सभी मैं मिल त्रुटि संदेश

Traceback (most recent call last): 
    File "sim.py", line 31, in <module> 
    newGrid = BigGrid(size) 
    File "sim.py", line 24, in BigGrid 
    b[i][j] = a[i][j]*l*p 
TypeError: 'function' object has no attribute '__getitem__' 
है

कृपया मदद करें।

+3

कुछ सामान्य नहीं है इसका मतलब है आपके numpy कोड के बारे में टिप्पणी: 1) 'np' के रूप में numpy आयात करने की कोशिश करें, था टी numpy सम्मेलन है। 2) वेक्टर ऑपरेशंस का उपयोग करें, यानी: डबल लूप के बजाय 'ए = बी * एल * पी'। यह सैकड़ों या हजारों बार तेज़ होगा, और इसे पढ़ना आसान है। 3) 'सरणी [i] [j]' के रूप में numpy arrays को इंडेक्स न करें, इसके बजाय 'सरणी [i, j]' का उपयोग करें, यह बहुत तेज है, और लिखने के लिए छोटा है;)। संक्षेप में, एक numpy ट्यूटोरियल पढ़ें। – jorgeca

उत्तर

25

ऐसा लगता है कि कोष्ठक की एक जोड़ी भूल गए हैं:

a = makeGrid(dim) 

आप अब क्या:

a = makeGrid 

सिर्फ बजाय makeGrid समारोह उपनाम यह बुलाने की। उसके बाद, आप a में सूचकांक करने का प्रयास करते हैं, तो जैसे:

a[i] 

यह एक समारोह है, जो __getitem__magic method ब्रैकेट अंकन के साथ अनुक्रमण के लिए आवश्यक नहीं है में सूचकांक के लिए कोशिश कर रहा है।

3

आपके पास कॉल नहीं कर रहे हैं makeGrid(), आप a को समारोह वस्तु ही बताए जा रहे हैं:

a = makeGrid(dim) 
4

के रूप में अन्य लोगों ने कहा है, तो आप makeGrid ठीक से कॉल करने की आवश्यकता .... बस के रूप में एक FYI करें, इस एक बहुत ही आम त्रुटि अजगर में देखने के लिए है, और यह आम तौर पर है कि अपने चर प्रकार है कि आप सोचा था कि यह किया गया था (इस मामले में, आप एक मैट्रिक्स उम्मीद कर रहे थे, लेकिन एक समारोह मिल गया)

TypeError: 'function' object has no attribute '__getitem__'