为了机器学习的目的,我必须设置一个输入张量,如下所示:
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<nM小于n,因为extra_information中的每个数组都是对象的集合。我可以使用for循环来做到这一点,但它必须能很好地扩展到大量的a。我想过把extra_infromation变成np.shape(extra_information)=(a,m=n,4)的形状,然后使用像np.dstack([tensor,extra_information],axis=1)这样的东西,但我不确定这是不是最优雅的解决方案,或者如何让extra_information变成我想要的形状,同时又能很好地缩放。倒数也保存到一个数组中:
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来进一步澄清这个问题。以2-d为例:
tensor=[[1,2,3],[3,4,5],[6,7,8],....,[...]]
extra_information=[[a],[b],[c],....[...]]
extra_information_intervall=[[0,2],[3,4],...,[0,0]]由于零填充,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]]发布于 2020-11-24 05:59:24
IIUC,您有一个由n对象组成的(a,n,6)张量,其中一些是interval对象。除了已有的6个特征之外,这些间隔对象每个还具有4个特征。保持这4个特征的张量是(a,m,4),其中m
假设这些间隔从第0个对象开始,并且它们在给定的重复次数(间隔长度)的基础上重复,我可以放心地说结构是跟随的-
ORIGINAL ADDITIONAL
Obj0 [......] --> Obj0 [....]
Obj1 [......]
Obj2 [......]
Obj3 [......] --> Obj3 [....]
Obj4 [......]
Obj5 [......]
Obj6 [......] --> Obj6 [....]
Obj7 [......]
Obj8 [......]
假设您想简单地将附加信息复制到接下来的几个对象,直到达到后续间隔,那么您基本上将填补m间隔之间的空白,这样您现在就拥有了包含附加信息的n对象。
您可以使用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对象,这样它才能知道每个对象需要分别重复多少次。而且,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.https://stackoverflow.com/questions/64972152
复制相似问题