1 回答

TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果您跳出框框思考(并且可能稍微調(diào)整您的要求),您就可以做到這一點(diǎn)。讓我們反轉(zhuǎn)設(shè)置方式并首先創(chuàng)建一個(gè)保存數(shù)據(jù)的緩沖區(qū):
np_x = np.array([2, 3, 4, 5])
現(xiàn)在稍微不同地定義你的類。我們不會(huì)記錄的值x,而是將指向它的指針記錄為數(shù)組和索引(稍后您可以使用原始內(nèi)存位置做一些有趣的事情,但我們現(xiàn)在不這樣做)。x您可以通過在類中創(chuàng)建屬性 aproperty并將其數(shù)據(jù)存儲(chǔ)在同名的實(shí)例屬性中來保持幾乎完全相同的接口:
class P:
def __init__(self, buffer, offset):
self.__dict__['x'] = (buffer, offset)
@property
def x(self):
buf, off = self.__dict__['x']
return buf[off]
@x.setter
def x(self, value):
buf, off = self.__dict__['x']
buf[off] = value
def __str__(self):
return str(self.x)
def __repr__(self):
return self.__str__()
現(xiàn)在您可以創(chuàng)建對(duì)象列表。這是代碼中唯一在類定義之外更改的部分:
obj_lst = [P(np_x, 0), P(np_x, 1), P(np_x, 2), P(np_x, 3)]
現(xiàn)在,您的所有更改都是相互透明的,因?yàn)槟蚕砭彌_區(qū):
>>> obj_lst[0].x = 10
>>> np_x
array([10, 3, 4, 5])
>>> np_x[-2] = 20
>>> obj_lst
[10, 3, 20, 5]
這樣做的巧妙之處在于,它P基本上適用于任何支持__getitem__和 的類型__setitem__,無論它是如何索引的。例如,您可以將其應(yīng)用于dict:
>>> d_x = {'a': 2, 'b': 3, 'c': 4, 'd': 5}
>>> obj_lst = [P(d_x, 'a'), P(d_x, 'b'), P(d_x, 'c'), P(d_x, 'd')]
>>> obj_lst[0].x = 10
>>> d_x
{'a': 10, 'b': 3, 'c': 20, 'd': 5}
>>> d_x['c'] = 20
>>> obj_lst
[10, 3, 20, 5]
您還可以向 numpy 數(shù)組提供復(fù)雜索引:
>>> np_x = np.arange(10)
>>> obj_lst = [P(np_x, 0), P(np_x, slice(1, None, 2)), P(np_x, [1, 2, 6, 8])]
>>> obj_lst
[0, [1 3 5 7 9], [1 2 6 8]]
>>> obj_lst[-1].x = 100
>>> np_x
array([ 0, 100, 100, 3, 4, 5, 100, 7, 100, 9])
>>> np_x[5:] = 20
>>> obj_lst
[0, [100 3 20 20 20], [100 100 20 20]]
添加回答
舉報(bào)