我有这4个矩阵,我想通过传递n:小矩阵的个数和输出矩阵行列示例,动态地将它们组合成一个大矩阵:
[[[ 1 2]
[ 3 4]]
[[ 5 6]
[ 7 8]]
[[ 9 10]
[11 12]]
[[13 14]
[15 16]]]输出矩阵:
[[ 1 2 5 6]
[ 3 4 7 8]
[ 9 10 13 14]
[11 12 15 16]]我可以使用以下方法手动完成:
M = np.bmat( [[x1], [x2], [x3], [x4]] )发布于 2016-05-02 00:16:00
我认为(但不知道它是否正确),最好是在内部工作,避免每次使用新方法创建新对象--特别是在循环多次时。这些例子仅适用于2d矩阵。但它可以很容易地实现到更多的维度。最好是在numpy.memmap数组中有一个大数组,如果它真的很大的话。那就做好它的部分。最快的索引(仅次于指针)是在cython内存视图上.
import numpy as np
def combine_matrix(*args):
n=len(args)
rows,cols=args[0].shape
a=np.zeros((n,cols*rows))
m=0
for i in range(n/rows):
for j in range(n/cols):
a[i*rows:(i+1)*rows,j*cols:(j+1)*cols]=args[m]
m+=1
return a
def example1():
print '#'*10
a=np.arange(1,17)
n=4
rows,cols=n/2,n/2
lst=[]
for i in range(n):
ai=a[i*n:(i+1)*n]
ai.shape=rows,cols
lst.append(ai)
print lst
print combine_matrix(*lst)
def example2():
print '#'*10
m=24
a=np.arange(m)
n=6
rows,cols=m/n/2,n/2
lst=[]
for i in range(m/n):
ai=a[i*n:(i+1)*n]
ai.shape=rows,cols
lst.append(ai)
print lst
print combine_matrix(*lst)
def example3():
print '#'*10
m,n=36,6
a=np.arange(m)
arrs=np.array_split(a,n)
for i in range(n):
ln=arrs[i].shape[0]
arrs[i].shape=2,ln/2
print combine_matrix(*arrs)
example1()
example2()
example3()发布于 2016-05-01 23:19:46
2分钟的实现(编辑前的问题,可能对某人有用):
import numpy as np
a=np.ones((10,10))
b=a*3
c=a*1
d=a*1.5
def combine_matrix(*args):
n=len(args)
rows,cols=args[0].shape
a=np.zeros((n,rows,cols))
for i in range(n):
a[i]=args[i]
return a
print combine_matrix(a,b,c,d)如果阵列的大小很大,就有改进的地方.
发布于 2016-05-02 03:14:59
编辑-我假设小数组是独立创建的,尽管我的示例是基于拆分一个(4,2,2)数组。如果他们真的只是一个3d阵列的平面,那么一些‘重塑’和‘转置’的组合将更好地工作。但是即使是这样的解决方案也会产生一个副本,因为原来的值是重新排列的。
让我们列出一个2x2数组的列表(这里是从一个3d数组)。需要压缩,因为这种拆分产生(1,2,2)数组:
n = len(A)
E = np.zeros((n,n))
In [330]: X=np.arange(1,17).reshape(4,2,2)
In [331]: xl=[np.squeeze(i) for i in np.split(X,4,0)]
In [332]: xl
Out[332]:
[array([[1, 2],
[3, 4]]), array([[5, 6],
[7, 8]]), array([[ 9, 10],
[11, 12]]), array([[13, 14],
[15, 16]])]您的bmat方法-修正以产生正方形排列
In [333]: np.bmat([[xl[0],xl[1]],[xl[2],xl[3]]])
Out[333]:
matrix([[ 1, 2, 5, 6],
[ 3, 4, 7, 8],
[ 9, 10, 13, 14],
[11, 12, 15, 16]])级联方式:
In [334]: np.vstack([np.hstack(xl[:2]),np.hstack(xl[2:])])
Out[334]:
array([[ 1, 2, 5, 6],
[ 3, 4, 7, 8],
[ 9, 10, 13, 14],
[11, 12, 15, 16]])因为切片在hstack中工作,所以我也可以在bmat中使用它
In [335]: np.bmat([xl[:2],xl[2:]])
Out[335]:
matrix([[ 1, 2, 5, 6],
[ 3, 4, 7, 8],
[ 9, 10, 13, 14],
[11, 12, 15, 16]])在内部,bmat (检查其代码)使用vstack of hstacks (在第一个和最后一个轴上进行接触)的版本。有效
In [366]: ll=[xl[:2], xl[2:]]
In [367]: np.vstack([np.hstack(row) for row in ll])
Out[367]:
array([[ 1, 2, 5, 6],
[ 3, 4, 7, 8],
[ 9, 10, 13, 14],
[11, 12, 15, 16]])如何指定这些n数组的排列方式。np.bmat(xl)生成一个(2,8)矩阵(hstack也一样)。np.vstack(xl)生成一个(8,2)数组。
将其扩展到处理子数组的3x3、2x3等布局应该不难。xl是子数组的列表。将其重新工作到所需的子数组列表中,并应用bmat或stacks组合。
2快速版本的2x3布局( 4d xl数组比2x3嵌套列表更易于构造,但功能相同:
In [369]: xl=np.arange(3*2*2*2).reshape((3,2,2,2))
In [370]: np.vstack([np.hstack(row) for row in xl])
Out[370]:
array([[ 0, 1, 4, 5],
[ 2, 3, 6, 7],
[ 8, 9, 12, 13],
[10, 11, 14, 15],
[16, 17, 20, 21],
[18, 19, 22, 23]])
In [371]: xl=np.arange(2*3*2*2).reshape((2,3,2,2))
In [372]: np.vstack([np.hstack(row) for row in xl])
Out[372]:
array([[ 0, 1, 4, 5, 8, 9],
[ 2, 3, 6, 7, 10, 11],
[12, 13, 16, 17, 20, 21],
[14, 15, 18, 19, 22, 23]])https://stackoverflow.com/questions/36972868
复制相似问题