首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy从对象类型numpy数组创建块矩阵

Numpy从对象类型numpy数组创建块矩阵
EN

Stack Overflow用户
提问于 2021-10-13 16:20:30
回答 1查看 59关注 0票数 0

我正在尝试创建具有此形状的numpy的分块矩阵

其中每个条目是一个4x4矩阵。

例如,让我们用4x4的零矩阵填充所有的条目。

代码语言:javascript
复制
N = 9
sizeOfBlock = 4
A = np.zeros((N, N), dtype =object)

for i in np.arange(N):
    for j in np.arange(N):
        A[i,j] = np.zeros((sizeOfBlock,sizeOfBlock))

这将创建具有正确形状的矩阵。现在我想把它从一个9x9的对象矩阵转换成一个36x36的矩阵来表示所有的条目。

有办法做到这一点吗?

诚挚的问候

EN

回答 1

Stack Overflow用户

发布于 2021-10-13 17:04:50

与列表列表相比,使用object dtype数组几乎没有任何优势。

block可以从嵌套的数组列表中生成数组:

代码语言:javascript
复制
In [294]: A=np.arange(4).reshape(2,2); Z=np.zeros((2,2),int)
In [295]: np.block([[A,Z],[Z,A]])
Out[295]: 
array([[0, 1, 0, 0],
       [2, 3, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 2, 3]])

一个对象数据类型数组:

代码语言:javascript
复制
In [296]: O = np.empty((2,2),object)
In [298]: O[0,0]=O[1,1]=A
In [300]: O[0,1]=O[1,0]=Z
In [301]: O
Out[301]: 
array([[array([[0, 1],
               [2, 3]]), array([[0, 0],
                                [0, 0]])],
       [array([[0, 0],
               [0, 0]]), array([[0, 1],

                                [2, 3]])]], dtype=object)

block对此并没有做任何有用的事情:

代码语言:javascript
复制
In [302]: np.block(O)
Out[302]: 
array([[array([[0, 1],
               [2, 3]]), array([[0, 0],
                                [0, 0]])],
       [array([[0, 0],
               [0, 0]]), array([[0, 1],
                                [2, 3]])]], dtype=object)

但是,如果我们变成一个列表列表,如295

代码语言:javascript
复制
In [303]: np.block(O.tolist())
Out[303]: 
array([[0, 1, 0, 0],
       [2, 3, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 2, 3]])

block的当前代码由于分派层而变得模糊,但当我过去查看它时,它使用的是递归hstackvstack

代码语言:javascript
复制
In [307]: np.vstack((np.hstack(O[0]),np.hstack(O[1])))
Out[307]: 
array([[0, 1, 0, 0],
       [2, 3, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 2, 3]])

concatenate和系列可以处理1d对象数据类型数组,将它们视为数组的序列或列表。它们不能直接使用二维数组。

评论建议使用4d数组:

代码语言:javascript
复制
In [308]: arr = np.array([[A,Z],[Z,A]])
In [309]: arr
Out[309]: 
array([[[[0, 1],
         [2, 3]],

        [[0, 0],
         [0, 0]]],


       [[[0, 0],
         [0, 0]],

        [[0, 1],
         [2, 3]]]])

简单的重塑不会保留块布局:

代码语言:javascript
复制
In [310]: arr.reshape(4,4)
Out[310]: 
array([[0, 1, 2, 3],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 1, 2, 3]])

但是轴交换将:

代码语言:javascript
复制
In [311]: arr.transpose(0,2,1,3).reshape(4,4)
Out[311]: 
array([[0, 1, 0, 0],
       [2, 3, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 2, 3]])

对于某些布局,Kronecker产品可以完成这项工作

代码语言:javascript
复制
In [315]: np.kron(np.eye(2).astype(int),A)
Out[315]: 
array([[0, 1, 0, 0],
       [2, 3, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 2, 3]])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69558957

复制
相关文章

相似问题

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