第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

是否可以讓 numpy 數(shù)組值和對(duì)象屬性都指向內(nèi)存中的同一位置?

是否可以讓 numpy 數(shù)組值和對(duì)象屬性都指向內(nèi)存中的同一位置?

九州編程 2023-10-18 16:08:13
在我正在開發(fā)的一個(gè)項(xiàng)目中,我想知道是否可以做類似的事情:class P:    def __init__(self, x):        self.x = x    def __str__(self):        return str(self.x)    def __repr__(self):        return self.__str__()obj_lst = [P(x=2), P(x=3), P(x=4), P(x=5)]np_x = array([p.x for p in obj_lst])obj_lst[0].x = 10print(np_x)預(yù)期的結(jié)果是,array([10, 3, 4, 5])還,np_x[2] = 20print(obj_lst)我會(huì)得到,[10, 3, 20, 5]因此,對(duì)象的屬性和數(shù)組中的值都指向內(nèi)存中的同一位置。這樣我就可以一方面使用 OOP 抽象,另一方面使用 numpy 的速度來進(jìn)行復(fù)雜的代數(shù)運(yùn)算。
查看完整描述

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]]


查看完整回答
反對(duì) 回復(fù) 2023-10-18
  • 1 回答
  • 0 關(guān)注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)