2012-12-10 38 views
7

Temel işlevi değerlendirmek için python'da bir kod yazmak. Bazı değerlere sahip bir 2d dizi var ve bu değerlerin her birine fonksiyonunu uygulamak ve yeni bir 2d diziyi almak istiyorum:TypeError: 'function' nesnesinin bir özniteliği yoktur '__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 

Ama olsun tüm hata mesajı

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__' 
olduğunu

Lütfen yardım edin.

+3

bazı genel tipi olmadığı anlamına gelir numpy kodunuzla ilgili açıklamalar: 1) tpy olarak nip' olarak numpy içe aktarmayı deneyin. Uyuşma kuralları. 2) Vektör işlemlerini kullanın, örn .: çift döngü yerine 'a = b * l * p'. Yüzlerce veya binlerce kez daha hızlı olacak ve okunması daha kolay. 3) numpy dizileri dizi [i] [j] 'olarak dizinlemeyin, bunun yerine' array [i, j] 'yi kullanın, daha hızlı ve yazmayı kısaltın;). Özetlemek için, bir numpy öğretici okuyun. – jorgeca

cevap

25

parantez çifti unutmuş görünür: Şimdi ne var

a = makeGrid(dim) 

:

a = makeGrid 

sadece aramak yerine makeGrid fonksiyonunu Takma Adlar. Ardından, bu yüzden gibi a içine endeksi çalıştığınızda: Bu __getitem__magic method ayraç ile endeksleme için gerekli olmayan bir fonksiyonu haline endeksi çalışıyor

a[i] 

. Sen makeGrid() demeyeceğiz

3

, sen a işlev nesnesini kendisi atıyorsanız: Diğerleri söylediler

a = makeGrid(dim) 
4

, düzgün makeGrid çağırmanız gerekir .... sadece bir Bilginize, bu kadar Python görmek oldukça yaygın hata olduğunu ve genellikle değişken bunu (bu durumda, bir matris bekliyorduk, ancak bir işlev var) düşündüm

TypeError: 'function' object has no attribute '__getitem__' 
İlgili konular