2012-12-10 37 views
7

Viết một số mã trong python để đánh giá một hàm cơ bản. Tôi đã có một mảng 2ngày với một số giá trị và tôi muốn áp dụng các chức năng để mỗi người trong số những giá trị và có được một mảng 2ngày mới:LoạiError: đối tượng 'function' không có thuộc tính '__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 

Nhưng tất cả tôi nhận được là thông báo lỗi

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

Vui lòng trợ giúp.

+3

nhận xét về mã numpy của bạn: 1) cố gắng 'nhập numpy như np', như tha t là quy ước numpy. 2) Sử dụng các phép toán vectơ, ví dụ: 'a = b * l * p' thay vì vòng lặp kép. Nó sẽ nhanh hơn hàng trăm hoặc hàng nghìn lần và dễ đọc hơn. 3) Không lập chỉ mục mảng numpy như 'mảng [i] [j]', sử dụng nó thay vì 'mảng [i, j]' nó nhanh hơn nhiều, và viết ngắn hơn;). Để tóm tắt, hãy đọc hướng dẫn gọn gàng. – jorgeca

Trả lời

25

Có vẻ bạn đã quên một cặp ngoặc đơn:

a = makeGrid(dim) 

Những gì bạn có bây giờ:

a = makeGrid 

chỉ là bí danh của makeGrid chức năng thay vì gọi nó. Sau đó, khi bạn cố gắng index vào a, như vậy:

a[i] 

nó đang cố gắng index vào một chức năng, mà không có __getitem__magic method cần thiết cho lập chỉ mục với ký hiệu khung.

3

Bạn sẽ không gọi makeGrid(), bạn đang gán đối tượng chức năng riêng của mình để a:

a = makeGrid(dim) 
4

Như những người khác đã nói, bạn cần phải gọi makeGrid đúng .... cũng giống như một FYI, này là một lỗi khá phổ biến để thấy trong Python, và nó thường có nghĩa là biến của bạn không phải là loại mà bạn nghĩ là (trong trường hợp này, bạn đang mong đợi một ma trận, nhưng có một hàm)

TypeError: 'function' object has no attribute '__getitem__' 
Các vấn đề liên quan