我有一个6乘6的矩阵,我想显示没有对角元素的上三角矩阵:
我做了什么:
Rand_num = np.random.rand(6,6)
for i in range(0,6):
for j in range(1,6):
print Rand_num[i][j]
在我看来,算法应该是:
for row = 1 to 6
for col = (row+1) to 6
print Rand_num[row][col]
我怎样才能使用Python?
问题归结为我的任务是用另一个列表中的元素填充矩阵: 例如,有一个包含15个元素的Tmpelem列表,我希望它们按顺序分配给一个新矩阵(6乘6),它们创建一个没有对角元素的三角矩阵。
答案 0 :(得分:2)
假设您使用NumPy就像创建矩阵一样好,只需使用numpy.triu
In[126]: samp = np.random.rand(3, 3)
In[127]: np.triu(samp, k=1)
Out[127]:
array([[ 0. , 0.77524531, 0.16391846],
[ 0. , 0. , 0.12625853],
[ 0. , 0. , 0. ]])
k
表示下面的对角线,其余部分应归零。
根据您的编辑,如果您打算使用值列表修改某些现有矩阵的上三角区域,您可以使用numpy.triu_indices
来获取正确的索引,这里使用(4,1)
表示4×4矩阵和主要上方的一个对角线。
In[142]: matr = np.arange(1, 17).reshape(4,4)
In[143]: matr
Out[143]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
In[144]: matr[np.triu_indices(4, 1)] = np.arange(100, 106)
In[145]: matr
Out[145]:
array([[ 1, 100, 101, 102],
[ 5, 6, 103, 104],
[ 9, 10, 11, 105],
[ 13, 14, 15, 16]])
答案 1 :(得分:-1)
有意义的是numpy有一个np.triu_indices,如Mitch所示
但循环也可以正常工作
A=np.zeros((6,6))
A
Out[31]:
array([[ 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0.]])
ulst = [i for i in range(1,16)]
ulst
Out[33]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
ulst_gen = (i for i in ulst)
for i in range(6):
for j in range(6):
if j > i:
A[i,j] = next(ulst_gen)
A
Out[36]:
array([[ 0., 1., 2., 3., 4., 5.],
[ 0., 0., 6., 7., 8., 9.],
[ 0., 0., 0., 10., 11., 12.],
[ 0., 0., 0., 0., 13., 14.],
[ 0., 0., 0., 0., 0., 15.],
[ 0., 0., 0., 0., 0., 0.]])