类内的Numpy数组赋值

时间:2013-06-03 14:59:29

标签: python class numpy python-3.x

我正在使用Python 3.2.3和NumPy 1.6.1。 如果有人能够解释我在尝试访问(以两种不同的方式)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]发生了什么?

由于

2 个答案:

答案 0 :(得分: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意图在您的班级中。

答案 1 :(得分: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