“较大阵列中子阵列串联”的双循环

2024-09-29 23:15:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在一个大阵列中自动地,“手动地”组装几个子阵列,它是:

import numpy as np
blank = np.empty([4,4])


A = np.ones([2,2])
B = np.ones([2,2]) * 2
C = np.ones([2,2]) * 3
D = np.ones([2,2]) * 4


A3d = np.reshape(A,(1,A.shape[0],A.shape[1]))
B3d = np.reshape(B,(1,B.shape[0],B.shape[1]))
C3d = np.reshape(C,(1,C.shape[0],C.shape[1]))
D3d = np.reshape(D,(1,D.shape[0],D.shape[1]))


conc = np.concatenate((A3d,B3d,C3d,D3d), axis=0)

blank[0:2,0:2] = conc[0,:,:]
blank[0:2,2:4] = conc[1,:,:]
blank[2:4,0:2] = conc[2,:,:]
blank[2:4,2:4] = conc[3,:,:]

我尝试了一个双循环,但它不工作。。。你知道吗

blank = np.empty([4,4])

for j in range(blank.shape[0]/A.shape[0]):
    for i in range(blank.shape[0]/A.shape[0]):
            blank[0:A.shape[0],j*A.shape[0]:A.shape[0]*(j+1)] = conc[j,:,:]

Tags: infornponesrange手动emptyblank
1条回答
网友
1楼 · 发布于 2024-09-29 23:15:49

制作conc的较短方法

conc = np.array([A,B,C,D])

您可以通过两个步骤连接这些片段,直接生成blank

blank = np.vstack([np.hstack([A,B]),np.hstack([C,D])])

那还是“手册”吗?你知道吗

让我们回顾一下blank

In [65]: blank
Out[65]: 
array([[ 1.,  1.,  2.,  2.],
       [ 1.,  1.,  2.,  2.],
       [ 3.,  3.,  4.,  4.],
       [ 3.,  3.,  4.,  4.]])

In [66]: blank.flatten()
Out[66]: 
array([ 1.,  1.,  2.,  2.,  1.,  1.,  2.,  2.,  3.,  3.,  4.,  4.,  3.,
        3.,  4.,  4.])

通常是可以组装一个由一个concat组成的大型阵列,然后进行整形。但是

In [69]: conc.flatten()
Out[69]: 
array([ 1.,  1.,  1.,  1.,  2.,  2.,  2.,  2.,  3.,  3.,  3.,  3.,  4.,
        4.,  4.,  4.])

conc中的数据元素是连续的。在blank中的那些是散布的。这就是构造blank更为棘手的原因。你知道吗

元素是否必须按blank排列?为什么不?你知道吗

In [82]: conc.reshape(4,4)
Out[82]: 
array([[ 1.,  1.,  1.,  1.],
       [ 2.,  2.,  2.,  2.],
       [ 3.,  3.,  3.,  3.],
       [ 4.,  4.,  4.,  4.]])

但要关注双重迭代,让我们尝试:

In [89]: for i in range(0,4,2):
   ....:     for j in range(0,4,2):
   ....:         print blank[i:i+2, j:j+2]
[[ 1.  1.]
 [ 1.  1.]]
[[ 2.  2.]
 [ 2.  2.]]
[[ 3.  3.]
 [ 3.  3.]]
[[ 4.  4.]
 [ 4.  4.]]

这就提供了一个如何构造作业的线索

In [100]: conc2=conc.reshape(2,2,2,2)
In [101]: x=np.empty([4,4])
In [102]: for i in range(0,4,2):
    for j in range(0,4,2):
        x[i:i+2, j:j+2]=conc2[i/2,j/2]
   .....:         
In [103]: x
Out[103]: 
array([[ 1.,  1.,  2.,  2.],
       [ 1.,  1.,  2.,  2.],
       [ 3.,  3.,  4.,  4.],
       [ 3.,  3.,  4.,  4.]])

这是可以清理的,但这只是一个开始。你知道吗


但是回到叠加,这里有一个迭代的方法:

np.vstack([np.hstack(conc[i:i+2,...]) for i in range(0,4,2)])

推广到其他形状:

In [149]: k,l,m,n = 3,4,2,3
In [150]: conc = np.array([np.ones([m,n],dtype=int)*i for i in range(k*l)])
In [151]: np.vstack([np.hstack(conc[i:i+l]) for i in range(0,k*l,l)]).shape
Out[151]: (6, 12)

相关问题 更多 >

    热门问题