[英]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.