尝试这个:
>>> A = np.zeros((6,6))
>>> i,j = np.indices(A.shape)
>>> z = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
现在,您可以直观地访问任何对角线:
>>> A[i==j-1] = z
>>> A
array([[ 0., 1., 0., 0., 0., 0.],
[ 0., 0., 2., 0., 0., 0.],
[ 0., 0., 0., 3., 0., 0.],
[ 0., 0., 0., 0., 4., 0.],
[ 0., 0., 0., 0., 0., 5.],
[ 0., 0., 0., 0., 0., 0.]])
Run Code Online (Sandbox Code Playgroud)
您可以用相同的方式将数组分配给A[i==j],等等。
您始终可以使用切片为对角线分配值或数组。
传入行索引列表和列索引列表可让您直接(且有效地)访问位置。例如:
>>> z = np.zeros((5,5))
>>> z[np.arange(5), np.arange(5)] = 1 # diagonal is 1
>>> z[np.arange(4), np.arange(4) + 1] = 2 # first upper diagonal is 2
>>> z[np.arange(4) + 1, np.arange(4)] = [11, 12, 13, 14] # first lower diagonal values
Run Code Online (Sandbox Code Playgroud)
将零数组更改z为:
array([[ 1., 2., 0., 0., 0.],
[ 11., 1., 2., 0., 0.],
[ 0., 12., 1., 2., 0.],
[ 0., 0., 13., 1., 2.],
[ 0., 0., 0., 14., 1.]])
Run Code Online (Sandbox Code Playgroud)
一般来说,对于k x k名为的数组z,您可以设置第ith 个上对角线
z[np.arange(k-i), np.arange(k-i) + i]
Run Code Online (Sandbox Code Playgroud)
和第ith 下对角线
z[np.arange(k-i) + i, np.arange(k-i)]
Run Code Online (Sandbox Code Playgroud)
注意:如果你想避免np.arange多次调用,你可以简单地写ix = np.arange(k)一次,然后根据需要对该范围进行切片:
np.arange(k-i) == ix[:-i]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1146 次 |
| 最近记录: |