3

我正在使用 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]

谢谢

4

2 回答 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和你的班级。

于 2013-06-03T15:05:35.727 回答
1

安迪的解释很到位。至于如何克服这个限制,我不喜欢到处输入空括号,所以对于这种类属性,我更喜欢使用properties,可能受 numpy'sshapedtype的影响:

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
于 2013-06-03T16:15:58.410 回答