Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类中的数组引用_Python_Arrays_Class_Magic Methods - Fatal编程技术网

Python类中的数组引用

Python类中的数组引用,python,arrays,class,magic-methods,Python,Arrays,Class,Magic Methods,我创建了一个类,里面有很多numpy数组。我创建了一个\uuuu getitem\uuuu函数,该函数尝试返回具有如下索引的数组的类: MyClass[i].array1相当于MyClass.array1[i] 我希望getitem返回引用,但它们返回的是副本,所以赋值不起作用 print(MyClass[i].array1) 返回0 MyClass[i].array1 = 10 print(MyClass[i].array1) 仍然返回0 这是我正在使用的_get_item_代码: de

我创建了一个类,里面有很多numpy数组。我创建了一个
\uuuu getitem\uuuu
函数,该函数尝试返回具有如下索引的数组的类:

MyClass[i].array1
相当于
MyClass.array1[i]

我希望getitem返回引用,但它们返回的是副本,所以赋值不起作用

print(MyClass[i].array1)
返回0

MyClass[i].array1 = 10

print(MyClass[i].array1)
仍然返回0

这是我正在使用的_get_item_代码:

def __getitem__(self, indices):
    g = copy.copy(self) # should be a shallow copy?
    for key,value in g.__dict__.iteritems():
        g.__dict__[key] = value[indices]
    return g
我也试过:

def __getitem__(self, indices):
    g = MyClass()
    for key,value in self.__dict__.iteritems():
        g.__dict__[key] = value[indices]
    return g
以及:

注意,最后一个实例似乎确实返回了引用,但不是我想要的方式。如果我使用最后一段代码为类编制索引,它将对原始类中的数组执行索引和截断,因此:

g=MyClass[i]。array1
截断并覆盖MyClass中的原始数组,使其仅包含索引i的元素,如下所示:

print(len(MyClass.array1))
返回128

print(MyClass[0].array1)
返回0

MyClass[i].array1 = 10

print(MyClass[i].array1)
现在
MyClass.array1
是一个单浮点值,显然不是我想要的

我希望这是足够清楚的,任何帮助将不胜感激


我发现了,但我不太确定这是否适用于我的问题。

这似乎是一个非常糟糕的主意,但它似乎也是一个有趣的问题,所以这里是我的破解方法:

class MyProxy(object):
    def __init__(self, obj, key):
        super(MyProxy, self).__setattr__('obj', obj)
        super(MyProxy, self).__setattr__('key', key)

    def __getattr__(self, name):
        return getattr(self.obj, name).__getitem__(self.key)

    def __setattr__(self, name, value):
        return getattr(self.obj, name).__setitem__(self.key, value)

class MyClass(object):
    def __init__(self, array_length):
        self.array_length = array_length

    def __getitem__(self, key):
        if key >= self.array_length:
            raise IndexError
        return MyProxy(self, key)
例如:

>>> obj = MyClass(4)  # replace 4 with the length of your arrays
>>> obj.array1 = [1, 2, 3, 4]
>>> obj.array2 = [5, 6, 7, 8]
>>> for c in obj:
...     print c.array1, c.array2
... 
1 5
2 6
3 7
4 8
>>> obj[1].array1
2
>>> obj[1].array1 = 5
>>> obj.array1
[1, 5, 3, 4]

它们实际上返回引用-只是给变量赋值会重新绑定引用,而不是跟随引用并处理它引用的对象。你可以写一些描述词来回避这个问题,但我首先要问的是,这是否是个好主意。这似乎大部分是可行的,虽然在MyClass中迭代c时遇到问题:c.array1=0错误:标记输入时发生意外错误,但以下回溯可能已损坏或无效错误消息为:('EOF in multi line string',(33,8))-->180返回getattr(self.obj,name)。\uu setitem__(self.key,value)索引器错误:索引128超出了大小为128的轴0的范围。所有numpy数组的长度是否都相同?如果不是,迭代将很棘手,我想它可能基于最长的numpy数组,但这似乎有点奇怪。是的,它们的第一维都具有相同的长度,尽管有些会有额外的第二或第三维基本上,它们是时间序列数据和信息,其中时间记录是第一个索引。它现在可以用于迭代,您只需要在创建实例时传递数组的长度。这可能会起作用,但我会根据init期间读取的数据设置长度变量,而不是显式传递它。然而,一个问题是,索引类实际上并没有返回类对象,因此没有附加任何方法。我们可以通过使用代理对原始类进行子类化来解决这个问题,比如:类MyProxy(MyClass)?