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

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

向量化列表列表的函數(shù)

向量化列表列表的函數(shù)

哈士奇WWW 2022-10-11 10:29:43
我需要使用具有以下特征的高效 python 數(shù)據(jù)結(jié)構(gòu):像列表一樣堆疊很多次的結(jié)構(gòu)列表長(zhǎng)度沒(méi)有規(guī)律有固定的深度始終具有相同的數(shù)據(jù)類型。這是一個(gè)深度為 3 的示例[[[1,2] , [3,4,5]], [[6,7,8] , [9] , [10] , [11,12]], [[13] , [14,15] , [16,17,18]]大多數(shù)情況下,該結(jié)構(gòu)將包含 numpy 數(shù)組或數(shù)字,但它也可能是另一個(gè)對(duì)象,如 dict。但是,給定結(jié)構(gòu)中的數(shù)據(jù)類型始終相同。我的主要問(wèn)題是我需要將函數(shù)應(yīng)用于此類結(jié)構(gòu)(如“矢量化”函數(shù))。我希望我的函數(shù)采用與參數(shù)具有相同形狀的幾個(gè)結(jié)構(gòu),并返回其他結(jié)構(gòu)。您認(rèn)為最有效的方法是:使用堆疊列表或堆疊 numpy 數(shù)組:那么如何在不使用許多for循環(huán)的情況下編寫(xiě)高效的“矢量化”函數(shù)?使用單個(gè)數(shù)組并分別存儲(chǔ)形狀(我目前正在研究這個(gè))創(chuàng)建自己的結(jié)構(gòu),但我怎樣才能使它比堆疊列表更有效?或者也許你知道一個(gè)可以幫助我的圖書(shū)館?我特別在尋找 RAM 效率。我希望我已經(jīng)把我的問(wèn)題說(shuō)清楚了,謝謝你的幫助。
查看完整描述

2 回答

?
守候你守候我

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊

如果您想獲得真正的矢量化處理,則需要使用諸如 numpy 之類的庫(kù)。但是這些可能會(huì)限制您可以支持的數(shù)據(jù)類型,以便允許 GPU 進(jìn)行處理。


在任何一種情況下,您都可以使用字典來(lái)展平結(jié)構(gòu)并促進(jìn)結(jié)構(gòu)元素的批處理。這將是一個(gè)以元組作為鍵的字典,其中元組中的每個(gè)條目表示該級(jí)別的值索引:


例如:


  [ [1,2] ,   [3,4,5] ],

  [ [6,7,8] , [9] ,     [10] ,     [11,12] ],

  [ [13] ,    [14,15] , [16,17,18] ]

]

可以在這樣的字典中表示為:


  (0,0,0) : 1,

  (0,0,1) : 2,

  (0,1,0) : 3,

  (0,1,1) : 4,

  (0,1,2) : 5,

  (1,0,0) : 6,

  (1,0,1) : 7,

  (1,0,2) : 8,

  (1,1,0) : 9,

  (1,2,0) : 10,

  (1,3,0) : 11,

  (1,3,1) : 12,

  (2,0,0) : 13,

  (2,1,0) : 14,

  (2,1,1) : 15,

  (2,1,0) : 16,

  (2,1,1) : 17,

  (2,1,2) : 18

}

這也可以使用兩個(gè)數(shù)組(一個(gè)用于級(jí)別索引,一個(gè)用于數(shù)據(jù))在 numpy 中表示


這種類型的結(jié)構(gòu)之間的處理將提供樹(shù)結(jié)構(gòu)中葉值的快速遍歷,同時(shí)保持分支之間的關(guān)系。


例如:


# sum of values under second branch:

result = sum( value for level,value in data.items() if level[0] == 1 )


# or using numpy:

result = np.sum(data[levels[:,0]==1]) 


# adding two structures:

result = { k:data1.get(k,0)+data2.get(k,0) for k in set((*data1,*data2)) }


# or using numpy (assuming same levels in both structures)

resultLevels, resultData = levels1,data1+data2


# numpy adding structures with different levels is a bit more involved

# but still feasible.



查看完整回答
反對(duì) 回復(fù) 2022-10-11
?
慕斯709654

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊

謝阿蘭 T。


我已經(jīng)使用了你的想法并編寫(xiě)了這個(gè)類來(lái)處理我的數(shù)據(jù)。這樣,我可以像使用 numpy 數(shù)組一樣使用 slice 訪問(wèn)我的元素,并且可以將 data 參數(shù)(扁平數(shù)據(jù))與 numpy 矢量化函數(shù)一起使用:


class DataStructure():

    __slots__ = ["data", "positions"]


    def __init__(self, data, place):

        self.data = np.array(data)

        self.positions = np.array(place)


    def __getitem__(self, item):

        item = (item,) if not isinstance(item, tuple) else item

        mask = np.full((len(self.positions),), True)

        for i, selection in enumerate(item):

            if not isinstance(selection, slice):

                mask &= self.positions[:, i] == selection

            else:

                start, stop, step = selection.indices(len(self.positions))

                mask &= np.isin(self.positions[:,i], range(start,stop,step))

        return self.data[mask]

PS:不要猶豫告訴我它是否可以優(yōu)化,特別是我使用切片。


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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