Python:如何将任意数量的小矩阵动态地组合成一个大矩阵

2024-09-19 22:33:34 发布

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

我有这4个矩阵,我想通过传递n:小矩阵的个数和输出矩阵的行和列,将它们动态地组合成一个大矩阵 示例:

[[[ 1  2]
  [ 3  4]]

 [[ 5  6]
  [ 7  8]]

 [[ 9 10]
  [11 12]]

 [[13 14]
  [15 16]]]

输出矩阵:

^{pr2}$

我可以手动使用:

M = np.bmat( [[x1], [x2], [x3], [x4]] )

Tags: 示例np动态矩阵手动行和列x1x2
3条回答

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)

如果阵列的大小是巨大的,有地方可以改进。。。在

您可以组合换位和重塑操作:

In [1878]: x=arange(24).reshape(4,3,2)

In [1879]: (_,n,m)=x.shape

In [1880]: x.reshape(2,2,n,m).transpose(0,2,1,3).reshape(2*n,2*m)
Out[1880]: 
array([[ 0,  1,  6,  7],
       [ 2,  3,  8,  9],
       [ 4,  5, 10, 11],
       [12, 13, 18, 19],
       [14, 15, 20, 21],
       [16, 17, 22, 23]])

我认为(但不知道是否正确),最好是就地工作,避免每次都用新方法创建新对象,特别是当你在循环中多次执行时。这些示例仅适用于二维矩阵。但它可以很容易地实现到更多的维度。最好是有一个大数组,如果它真的很大的话numpy.memmap数组。那就做它的部分。最快的索引(仅次于指针)将在cython memoryviews上。。。在

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()

相关问题 更多 >