在定义的对角线周围的 numpy 数组中设置递增值
Setting increasing values in a numpy array around a defined diagonal
在 python 中创建二维列表(或 numpy 数组)的最佳方法是什么,其中对角线设置为 -1,其余值从 0 增加 1,对于不同的值的 n。例如,如果 n = 3,数组将如下所示:
[[-1,0,1]
[2,-1,3]
[4,5,-1]]
或 n = 4:
[[-1,0,1,2]
[3,-1,4,5]
[6,7,-1,8]
[9,10,11,-1]]
等等
我知道我可以创建一个包含零且对角线设置为 -1 的数组:
一 = numpy.zeros((n,n))
numpy.fill_diagonal(a,-1)
所以如果 n = 3 这将给出:
[[-1,0,0]
[0,-1,0]
[0,0,-1]]
但是我如何将 0 设置为递增数字,如上例所示?我是否需要遍历并通过循环设置值?或者有更好的方法来解决这个问题吗?
提前致谢。
一种方法-
def set_matrix(n):
out = np.full((n,n),-1)
off_diag_mask = ~np.eye(n,dtype=bool)
out[off_diag_mask] = np.arange(n*n-n)
return out
样品运行 -
In [23]: set_matrix(3)
Out[23]:
array([[-1, 0, 1],
[ 2, -1, 3],
[ 4, 5, -1]])
In [24]: set_matrix(4)
Out[24]:
array([[-1, 0, 1, 2],
[ 3, -1, 4, 5],
[ 6, 7, -1, 8],
[ 9, 10, 11, -1]])
这里有一个算术方式:
m=np.arange(n*n).reshape(n,n)*n//(n+1)
m.flat[::n+1]=-1
对于 n=5
:
[[-1 0 1 2 3]
[ 4 -1 5 6 7]
[ 8 9 -1 10 11]
[12 13 14 -1 15]
[16 17 18 19 -1]]
在 python 中创建二维列表(或 numpy 数组)的最佳方法是什么,其中对角线设置为 -1,其余值从 0 增加 1,对于不同的值的 n。例如,如果 n = 3,数组将如下所示:
[[-1,0,1]
[2,-1,3]
[4,5,-1]]
或 n = 4:
[[-1,0,1,2]
[3,-1,4,5]
[6,7,-1,8]
[9,10,11,-1]]
等等
我知道我可以创建一个包含零且对角线设置为 -1 的数组: 一 = numpy.zeros((n,n)) numpy.fill_diagonal(a,-1)
所以如果 n = 3 这将给出:
[[-1,0,0]
[0,-1,0]
[0,0,-1]]
但是我如何将 0 设置为递增数字,如上例所示?我是否需要遍历并通过循环设置值?或者有更好的方法来解决这个问题吗?
提前致谢。
一种方法-
def set_matrix(n):
out = np.full((n,n),-1)
off_diag_mask = ~np.eye(n,dtype=bool)
out[off_diag_mask] = np.arange(n*n-n)
return out
样品运行 -
In [23]: set_matrix(3)
Out[23]:
array([[-1, 0, 1],
[ 2, -1, 3],
[ 4, 5, -1]])
In [24]: set_matrix(4)
Out[24]:
array([[-1, 0, 1, 2],
[ 3, -1, 4, 5],
[ 6, 7, -1, 8],
[ 9, 10, 11, -1]])
这里有一个算术方式:
m=np.arange(n*n).reshape(n,n)*n//(n+1)
m.flat[::n+1]=-1
对于 n=5
:
[[-1 0 1 2 3]
[ 4 -1 5 6 7]
[ 8 9 -1 10 11]
[12 13 14 -1 15]
[16 17 18 19 -1]]