我想创建一个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个矩阵保存到数组元素中,然后串联或堆叠它们吗?
答案 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]])