我正在使用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]
发生了什么?
由于
答案 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