Python连接并堆叠许多矩阵

时间:2019-03-14 10:37:22

标签: python numpy matrix numpy-ndarray

我想创建一个square matrix like this one,其中它的元素是一个正方形矩阵,或者是B正方形矩阵,或者是负单位矩阵或零。我创建了B矩阵以及-I,还创建了Z矩阵零。具有相同n1 * n1(或n2 * n2)维的B,I和Z平方矩阵,最后一个矩阵我要具有n * n维,其中n = n1 * n2

例如,如果B,I和Z为4 * 4,则最终值为16 * 16

我知道如何连接和堆叠矩阵,但是我不知道如何更好地实现这一点,因为需要使下面的过程为64!时间。

for iter in range(64):
if iter == 0:
    temp = B
    temp = np.hstack((temp, I))
    temp = np.hstack((temp, Z))
    temp = np.hstack((temp, Z))
if iter == 1:
    temp2 = I
    temp2 = np.hstack((temp2, B))
    temp2 = np.hstack((temp2, I))
    temp2 = np.hstack((temp2, Z))
if iter == 2:
    temp3 = Z
    temp3 = np.hstack((temp3, I))
    temp3 = np.hstack((temp3, B))
    temp3 = np.hstack((temp3, I))
if iter == 3:
    temp4 = Z
    temp4 = np.hstack((temp4, Z))
    temp4 = np.hstack((temp4, I))
    temp4 = np.hstack((temp4, B)) 
    .......
    ........
    ........

st1 = np.vstack((temp, temp2))
st2 = np.vstack((st1, temp3))
.......

我可以将n * n个矩阵保存到数组元素中,然后串联或堆叠它们吗?

2 个答案:

答案 0 :(得分:0)

根据要处理的是numpy数组还是列表,可以使用以下示例追加数组:

import numpy as np
x = np.array([[11.1, 12.1, 13.1], [21.1, 22.1, 23.1]])
print(x.shape)
y = np.array([[11.2, 12.2],[21.2, 22.2]])
print(y.shape)
z = np.append(x,y, axis=1)
print(z.shape)
print(z)

请注意,如@ user2699所述,对于大型数组大小(Fastest way to grow a numpy numeric array),numpy附加可能会变慢。

对于列表,您可以使用append命令:

x = [1, 2, 3]
x.append([4, 5])
print (x) #

此示例摘自:Difference between append vs. extend list methods in Python

答案 1 :(得分:0)

np.block帮助您创建如下数组:

In [109]: B =np.arange(1,5).reshape(2,2)                                        
In [110]: I =np.eye(2).astype(int)                                              
In [111]: Z = np.zeros((2,2),int)                                               
In [112]: np.block?                                                             
In [113]: np.block([[B,I,Z,Z],[I,B,I,Z],[Z,I,B,I],[Z,Z,I,B]])                   
Out[113]: 
array([[1, 2, 1, 0, 0, 0, 0, 0],
       [3, 4, 0, 1, 0, 0, 0, 0],
       [1, 0, 1, 2, 1, 0, 0, 0],
       [0, 1, 3, 4, 0, 1, 0, 0],
       [0, 0, 1, 0, 1, 2, 1, 0],
       [0, 0, 0, 1, 3, 4, 0, 1],
       [0, 0, 0, 0, 1, 0, 1, 2],
       [0, 0, 0, 0, 0, 1, 3, 4]])

block进行concatenate的嵌套序列,从最里面的列表开始。以前的版本在内部列表中使用hstack,在结果中使用vstack

In [118]: np.vstack((np.hstack([B,I,Z,Z]),np.hstack([I,B,I,Z])))                
Out[118]: 
array([[1, 2, 1, 0, 0, 0, 0, 0],
       [3, 4, 0, 1, 0, 0, 0, 0],
       [1, 0, 1, 2, 1, 0, 0, 0],
       [0, 1, 3, 4, 0, 1, 0, 0]])

[113]中的列表列表可以使用所需的大小通过代码构造,但我不会赘述。

另一种方法是创建一个np.zeros((8,8))目标数组,并填充所需的块。制作np.zeros((4,2,4,2)),填充并在以后重新塑形可能更好。

In [119]: res = np.zeros((4,2,4,2),int)                                         
In [120]: res[np.arange(4),:,np.arange(4),:] = B                                
In [121]: res[np.arange(3),:,np.arange(1,4),:] = I                              
In [122]: res[np.arange(1,4),:,np.arange(3),:] = I  
In [124]: res.reshape(8,8)                                                      
Out[124]: 
array([[1, 2, 1, 0, 0, 0, 0, 0],
       [3, 4, 0, 1, 0, 0, 0, 0],
       [1, 0, 1, 2, 1, 0, 0, 0],
       [0, 1, 3, 4, 0, 1, 0, 0],
       [0, 0, 1, 0, 1, 2, 1, 0],
       [0, 0, 0, 1, 3, 4, 0, 1],
       [0, 0, 0, 0, 1, 0, 1, 2],
       [0, 0, 0, 0, 0, 1, 3, 4]])