2012-12-10 40 views
7

Zapisywanie kodu w pythonie w celu oceny podstawowej funkcji. Mam 2d tablicy z pewnych wartości i chcę zastosować funkcję do każdego z tych wartości i uzyskać nowy 2d tablicy:TypeError: Obiekt 'function' nie ma atrybutu '__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 

Ale ja dostać jest komunikat o błędzie

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__' 

Proszę o pomoc.

+3

Część ogólna uwagi na temat twojego numpy kodu: 1) spróbuj "zaimportować numpy jako np.", tak jak Jest to numpy konwencja. 2) Użyj operacji wektorowych, tzn .: 'a = b * l * p' zamiast podwójnej pętli. Będzie to setki lub tysiące razy szybsze i łatwiejsze do odczytania. 3) Nie indeksuj numpy tablic jako 'array [i] [j]', używaj tego zamiast 'array [i, j]' jest znacznie szybszy i krótszy do napisania;). Podsumowując, przeczytaj numpy samouczek. – jorgeca

Odpowiedz

25

Wydaje zapomniałeś parę nawiasów:

a = makeGrid(dim) 

Co masz teraz:

a = makeGrid 

tylko aliasy funkcję makeGrid zamiast nazywając ją. Następnie, podczas próby indeksu do a, tak:

a[i] 

to próbuje wskaźnika do funkcji, która nie ma __getitem__magic method potrzebne do indeksowania z notacją zamka.

3

Nie dzwonisz makeGrid(), jesteś sam obiekt przypisanie funkcji do a:

a = makeGrid(dim) 
4

Jak mówili inni, trzeba zadzwonić makeGrid prawidłowo .... tylko jako FYI, to jest to dość częsty błąd, aby zobaczyć w Pythonie, i to na ogół oznacza, że ​​zmienna nie jest typem, który myślał, że to (w tym przypadku, to liczyliśmy matrycę, ale ma funkcji)

TypeError: 'function' object has no attribute '__getitem__' 
Powiązane problemy