2017-09-26 51 views
0

使用制作3D阵列与1D阵列,这取决于一维数组的索引零填充numpythonically

n=4 
cols=3 
k=np.vstack((a,b,a*b,np.zeros((n,cols)),a,b,a,a,b**2,np.zeros((n,cols)),a*2,a)).T.reshape(-1,2,n+5) 

,其中一个考虑下面的一维数组

a=np.arange(3)+9 
b=np.arange(3)+5 

目前我正在初始化新的3D阵列和b将始终是相同的形状

其结果在

array([[[ 9., 5., 45., 0., 0., 0., 0., 9., 5.], 
     [ 9., 9., 25., 0., 0., 0., 0., 18., 9.]], 

     [[ 10., 6., 60., 0., 0., 0., 0., 10., 6.], 
     [ 10., 10., 36., 0., 0., 0., 0., 20., 10.]], 

     [[ 11., 7., 77., 0., 0., 0., 0., 11., 7.], 
     [ 11., 11., 49., 0., 0., 0., 0., 22., 11.]]]) 

我将如何使用类似的技术,也没有一个for循环中,改变零填充到以下:

array([[[ 9., 5., 45., 9., 5., 0., 0., 0., 0.], 
     [ 9., 9., 25., 18., 9., 0., 0., 0., 0.]], 

     [[ 10., 6., 60., 0., 0., 10., 6., 0., 0.], 
     [ 10., 10., 36., 0., 0., 20., 10., 0., 0.]], 

     [[ 11., 7., 77., 0., 0., 0., 0., 11., 7.], 
     [ 11., 11., 49., 0., 0., 0., 0., 22., 11.]]]) 
+0

对不起n为意味着是4和cols是3 – Alex

回答

1

人们可以使用advanced-indexing那些数组值指定到零初始化数组给定的列索引 -

out = np.zeros((3,2,9),dtype=bool) 
vals = np.array([[a,b,a*b,a,b],[a,a,b**2,2*a,a]]) 
out[np.arange(3)[:,None],:, idx] = vals.T 

样品运行 -

In [448]: a 
Out[448]: array([ 9, 10, 11]) 

In [449]: b 
Out[449]: array([5, 6, 7]) 

In [450]: out 
Out[450]: 
array([[[ 9., 5., 45., 9., 5., 0., 0., 0., 0.], 
     [ 9., 9., 25., 18., 9., 0., 0., 0., 0.]], 

     [[ 10., 6., 60., 0., 0., 10., 6., 0., 0.], 
     [ 10., 10., 36., 0., 0., 20., 10., 0., 0.]], 

     [[ 11., 7., 77., 0., 0., 0., 0., 11., 7.], 
     [ 11., 11., 49., 0., 0., 0., 0., 22., 11.]]]) 
+0

即使不仅有向量a,而且还有其他向量,如k = np.vstack((a,b,b,np.zeros((n,cols)),d,e,f,g) h,np.zeros((n,cols)),a,a))T.reshape(-1,2,n + 5) – Alex

+0

@Alex所有'a,b,c,d,e,f ,g,h'具有相同的形状? – Divakar

+0

是的,都一样 – Alex