2013-06-03 78 views
3

我使用Python 3.2.3和NumPy 1.6.1。 如果有人能解釋我在嘗試訪問(以兩種不同方式)NumPy數組的元素時,NumPy會做什麼,我將不勝感激。類中的Numpy數組賦值

代碼

import numpy as np 

class MyClass: 

    def __init__(self,q): 
     self.coord = q 
     self.firstel = q[0] 
     self.secondel = q[1:2] 

q = np.array([10,20]) # numpy array 
my_object = MyClass(q) # object of MyClass 

print('original','q:',q,'/coord:',my_object.coord,'/2elements:',my_object.firstel,my_object.secondel]) 

q[0],q[1] = 30,40 # modification of the elements of q 

print('modified','q:',q,'/coord:',my_object.coord,'/elements:', my_object.firstel, my_object.secondel]) 

q是numpy的陣列,我作爲參數傳遞到MyClass。我將它存儲在一個名爲coord的變量中。然後我在課堂上以兩種不同的方式訪問q的第一個和第二個元素。

當我運行上面的代碼,我得到這個:

original q: [10 20]/coord: [10 20]/elements: [10, array([20])] 
modified q: [30 40]/coord: [30 40]/elements: [10, array([40])] 

變量firstel沒有更新q改變,但變量secondel

q[0]q[1:2]發生了什麼?

由於

回答

4

firstel變量是一個(不可變)並因此從未更新:

self.firstel = q[0] # and stays this value once and for all 

secontel變量是原始陣列上的視圖等將被更新:

self.secondel = q[1:2] 

。要解決這個

一種方法是使firstel的方法:

def firstel(self): 
    return self.q[0] 

這可能使它更清晰什麼firstel的意圖secondel在類。

+0

謝謝!很明顯。我期待着這樣的事情。只是一個評論:在我的問題中沒有真正的「問題」,而是我想了解的兩種不同的行爲。 – RolPasto

1

安迪的解釋是現貨。至於如何克服這個限制,我不喜歡在所有地方都輸入空括號,所以對於這種班級屬性,我更喜歡properties,可能受numpy的shape,dtype之類的影響:

class MyClass(object): 

    def __init__(self, q): 
     self.coord = np.asarray(q) 

    @property 
    def firstel(self): 
     """The first element of self.coord""" 
     return self.coord[0] 

    @property 
    def secondel(self): 
     """The second element of self.coord""" 
     return self.coord[1] 

現在:

>>> q = np.array([10, 20]) 
>>> my_object = MyClass(q) 
>>> my_object.firstel 
10 
>>> my_object.secondel 
20 
>>> q[:] = [30, 40] 
>>> my_object.firstel 
30 
>>> my_object.secondel 
40