簡體   English   中英

通過相同的數組擴展數組的數組間隔

[英]extend array intervals of arrays by the same array

我必須為機器學習目的設置一個輸入張量,如下所示:

tensor=array[array[object_1],array[object_2],...,array[object_n]]
np.shape(tensor)=(a,n,6)

現在每個對象數組都是一維的,假設有 6 個條目是描述它們的變量。 我想用另外 4 個條目擴展這 6 個條目。 此擴展信息的變量保存在數組中

np.shape(extra_information)=(a,m,4) #m<n

m 小於 n 因為 extra_information 中的每個數組都用於對象的間隔。 我可以使用 for 循環來做到這一點,但它必須能夠很好地擴展大量 a。 extra_infromation變成np.shape(extra_information)=(a,m=n,4)的形狀,然后使用類似np.dstack([tensor,extra_information],axis=1)但我不確定這是最優雅的解決方案或如何在縮放良好的同時將extra_information變成我想要的形狀。 inverals 也保存到一個數組中:

 np.shape(extra_information_intervall)=(a,m,2) #m<n

編輯:

I have no following solution that works but is surely inefficient:

    def extend(track,jet,padding_size):
        event,jets,var=np.shape(jet)
        jet_to_track_data=[]
        for i in jet:
            event_jet_to_track=[]
            lasttrack=0
            for k in i:
                if k[4]!=0:
                    
                    x=np.array([k[l] for l in range(var-2)])
                    shape=(int(k[var-1]-k[var-2]),var-2)
                    
                    value=np.broadcast_to(x,shape)
                    event_jet_to_track.append(value)
                    lasttrack=k[var-1]
                else:
                    x=np.array((var-2)*[0])
                    shape=(int(padding_size-lasttrack),var-2)
                    
                    value=np.broadcast_to(x,shape)
                    
                    event_jet_to_track.append(value)
                    break
        
          jet_to_track_data.append(event_jet_to_track)
      jet_to_track_data=[np.vstack(x) for x in jet_to_track_data]
      jet_to_track_data=np.stack(jet_to_track_data)
      extended=np.concatenate([track,jet_to_track_data],axis=2)
      return extended

進一步澄清問題。 以二維為例:

tensor=[[1,2,3],[3,4,5],[6,7,8],....,[...]]
extra_information=[[a],[b],[c],....[...]]
extra_information_intervall=[[0,2],[3,4],...,[0,0]]

由於zerro填充的形狀extra_information(a,n,4)但它僅包含信息到第m條目和將被以零填充其間n和m。 這也適用於extra_information_intervall 現在的目標是將這些信息合並到張量中,如:

tensor=[[1,2,3,a],[3,4,5,a],[6,7,8,b],....,[...,0]]

IIUC,你有一個(a,n,6)張量,它由n對象組成,其中一些是區間對象。 除了已有的 6 個特征之外,這些區間對象每個都有 4 個特征。 擁有這 4 個特征的張量是(a,m,4) ,其中 m<n 和 m = n 個對象之間的間隔對象數。

假設這些間隔從第 0 個對象開始,並且它們基於給定的重復次數(間隔長度)重復,我可以肯定地說結構如下 -

ORIGINAL            ADDITIONAL
Obj0 [......]  -->  Obj0 [....]
Obj1 [......]       
Obj2 [......]       
Obj3 [......]  -->  Obj3 [....]
Obj4 [......]        
Obj5 [......]        
Obj6 [......]  -->  Obj6 [....] 
Obj7 [......]
Obj8 [......]

假設您只想將附加信息復制到接下來的幾個對象,直到達到后續間隔,您基本上將填充m間隔之間的間隙,這樣現在您有n帶有附加信息的對象。

你可以用np.repeat做到這np.repeat 您可以計算從您的時間間隔列表中重復每個m對象的次數並將其存儲在s 關於這一點的詳細解釋在最后一段。

a = np.random.random((2,10,6))
b = np.random.random((2,5,4))

s = np.array([2,3,2,2,1])  #Number of elements = number of objects m
                           #Sum of elements = number of objects n

new_b = np.repeat(b, s, axis=1)
#new_b shape = (2,10,4)

out = np.dstack((a, new_b))
out.shape
(2, 10, 10)

這將執行以下操作 -

ORIGINAL            ADDITIONAL
Obj0 [......]  -->  Obj0 [....]
Obj1 [......]  -->  Obj0 [....]       
Obj2 [......]  -->  Obj0 [....]       
Obj3 [......]  -->  Obj3 [....]
Obj4 [......]  -->  Obj3 [....]        
Obj5 [......]  -->  Obj3 [....]        
Obj6 [......]  -->  Obj6 [....] 
Obj7 [......]  -->  Obj6 [....] 
Obj8 [......]  -->  Obj6 [....] 

編輯:我已經根據您的輸入更新了我的答案。 由於間隔可以是可變長度,您仍然可以簡單地使用np.repeat但只需傳遞另一個參數s ,它告訴它每個元素重復多少次。 這可以從您的間隔列表中計算出來。 這個s數組的長度需要等於m對象,所以它可以告訴每個對象需要分別重復多少次。 AND, s的總和需要等於n因為重復后的輸出數組需要與原始數組具有相同的對象 = n

s = np.array([2,3,2,2,1])  #Number of elements = number of objects m
                           #Sum of elements = number of objects n

#First object from m objects will repeat 2 times, 
#second will repeat 3 times, etc...

#Total number of objects created after 
#repetitions = 10 = objects in original tensor.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM