我想编写一个python函数,它生成一个大小为n乘零的零矩阵,对于主对角线上方的所有元素都有1。
这是我的代码:
def funtest(n):
for i in range(0,n-2):
s = (n,n)
Y = zeros(s)
Z = Y
Z[i,i+1]=1
return Z
但结果只在矩阵的(n-1,n-2)元素中给出1。
我陷入困境,我认为我的代码是正确的,并且不知道错误在哪里。我该如何解决?有人可以帮忙吗?
感谢。
答案 0 :(得分:8)
import numpy as np
print( np.diag(np.ones(4), 1) )
函数可以完成此操作:
1
使用第二个参数(array([[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 1.],
[ 0., 0., 0., 0., 0.]])
)对角线的偏移量。它给出了:
$screenWidth=$(this).width();
function checkWindowWidth() {
if($screenWidth<767){
}
if(991>$screenWidth && $screenWidth>768){
$('.number',.number+span).css('width','100%');
}
if($screenWidth<1199 && $screenWidth>992){
$('.number,.number+span').css('width','45%');
}
if($screenWidth>1199){
$('.number,.number+span').css('width','33%');
}
}
答案 1 :(得分:4)
你想要的只是一个对角线,还是整个上三角?
有一组np.tri*
函数可用于索引和创建上三角和下三角数组:
In [395]: np.triu(np.ones((5,5),int),1)
Out[395]:
array([[0, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]])
我甚至可以通过两次tri
来电创建对角线
In [399]: np.tril(np.triu(np.ones((5,5),int),1),1)
Out[399]:
array([[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]])
不是我建议通过np.diag
功能。 :)
或
In [404]: np.diagflat(np.ones(4,int),1)
Out[404]:
array([[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]])
答案 2 :(得分:2)
您在每次迭代时将矩阵重置为零。将zeros
调用移到循环外部,它可以正常工作:
def funtest(n):
s = (n,n)
Y = zeros(s)
for i in range(0,n-1):
Y[i,i+1]=1
return Y
请注意,您还需要循环到n-1,而不是n-2(向上移动行只会将1的数量减少1!)。以下是上述固定函数的输出:
funtest(5)
array([[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 1.],
[ 0., 0., 0., 0., 0.]])
这与您的方法相符,但也请numpy
使用np.diag(np.ones(n-1),1)
内置^('[^']*')(=>)('[^']*')$
。