首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数组的数组间隔扩展相同的数组

将数组的数组间隔扩展相同的数组
EN

Stack Overflow用户
提问于 2020-11-24 00:17:41
回答 1查看 54关注 0票数 0

为了机器学习的目的,我必须设置一个输入张量,如下所示:

代码语言:javascript
复制
tensor=array[array[object_1],array[object_2],...,array[object_n]]
np.shape(tensor)=(a,n,6)

现在,每个对象数组都是一维的,假设有6个条目是描述它们的变量。我想用另外4个条目来扩展这6个条目。此扩展信息的变量保存在数组中

代码语言:javascript
复制
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变成我想要的形状,同时又能很好地缩放。倒数也保存到一个数组中:

代码语言:javascript
复制
 np.shape(extra_information_intervall)=(a,m,2) #m<n

编辑:

代码语言:javascript
复制
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为例:

代码语言:javascript
复制
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也是如此。现在的目标是将这些信息合并到张量中,如:

代码语言:javascript
复制
tensor=[[1,2,3,a],[3,4,5,a],[6,7,8,b],....,[...,0]]
EN

回答 1

Stack Overflow用户

发布于 2020-11-24 05:59:24

IIUC,您有一个由n对象组成的(a,n,6)张量,其中一些是interval对象。除了已有的6个特征之外,这些间隔对象每个还具有4个特征。保持这4个特征的张量是(a,m,4),其中m

假设这些间隔从第0个对象开始,并且它们在给定的重复次数(间隔长度)的基础上重复,我可以放心地说结构是跟随的-

代码语言:javascript
复制
ORIGINAL            ADDITIONAL
Obj0 [......]  -->  Obj0 [....]
Obj1 [......]       
Obj2 [......]       
Obj3 [......]  -->  Obj3 [....]
Obj4 [......]        
Obj5 [......]        
Obj6 [......]  -->  Obj6 [....] 
Obj7 [......]
Obj8 [......]

假设您想简单地将附加信息复制到接下来的几个对象,直到达到后续间隔,那么您基本上将填补m间隔之间的空白,这样您现在就拥有了包含附加信息的n对象。

您可以使用np.repeat来实现这一点。您可以计算间隔列表中每个m对象的重复次数,并将其存储在s中。关于这一点的详细解释在最后一段。

代码语言:javascript
复制
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

代码语言:javascript
复制
(2, 10, 10)

这将执行以下操作:

代码语言:javascript
复制
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相同的对象

代码语言:javascript
复制
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.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64972152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档