亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

向量化列表列表的函數

向量化列表列表的函數

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

2 回答

?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

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


在任何一種情況下,您都可以使用字典來展平結構并促進結構元素的批處理。這將是一個以元組作為鍵的字典,其中元組中的每個條目表示該級別的值索引:


例如:


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

}

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


這種類型的結構之間的處理將提供樹結構中葉值的快速遍歷,同時保持分支之間的關系。


例如:


# 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.



查看完整回答
反對 回復 2022-10-11
?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

謝阿蘭 T。


我已經使用了你的想法并編寫了這個類來處理我的數據。這樣,我可以像使用 numpy 數組一樣使用 slice 訪問我的元素,并且可以將 data 參數(扁平數據)與 numpy 矢量化函數一起使用:


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:不要猶豫告訴我它是否可以優化,特別是我使用切片。


查看完整回答
反對 回復 2022-10-11
  • 2 回答
  • 0 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號