2013-06-03 53 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