首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python :如何动态地将任意数量的小矩阵组合成一个大矩阵

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

Stack Overflow用户
提问于 2016-05-01 22:49:23
回答 4查看 2K关注 0票数 0

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

代码语言:javascript
复制
[[[ 1  2]
  [ 3  4]]

 [[ 5  6]
  [ 7  8]]

 [[ 9 10]
  [11 12]]

 [[13 14]
  [15 16]]]

输出矩阵:

代码语言:javascript
复制
[[ 1  2  5  6]
 [ 3  4  7  8]
 [ 9 10 13 14]
 [11 12 15 16]]

我可以使用以下方法手动完成:

代码语言:javascript
复制
M = np.bmat( [[x1], [x2], [x3], [x4]] )
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-02 00:16:00

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

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2016-05-01 23:19:46

2分钟的实现(编辑前的问题,可能对某人有用):

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

如果阵列的大小很大,就有改进的地方.

票数 1
EN

Stack Overflow用户

发布于 2016-05-02 03:14:59

编辑-我假设小数组是独立创建的,尽管我的示例是基于拆分一个(4,2,2)数组。如果他们真的只是一个3d阵列的平面,那么一些‘重塑’和‘转置’的组合将更好地工作。但是即使是这样的解决方案也会产生一个副本,因为原来的值是重新排列的。

让我们列出一个2x2数组的列表(这里是从一个3d数组)。需要压缩,因为这种拆分产生(1,2,2)数组:

代码语言:javascript
复制
    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方法-修正以产生正方形排列

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

级联方式:

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

代码语言:javascript
复制
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 (在第一个和最后一个轴上进行接触)的版本。有效

代码语言:javascript
复制
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是子数组的列表。将其重新工作到所需的子数组列表中,并应用bmatstacks组合。

2快速版本的2x3布局( 4d xl数组比2x3嵌套列表更易于构造,但功能相同:

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

https://stackoverflow.com/questions/36972868

复制
相关文章

相似问题

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