diag_indices的代码很简单,简单到没用过:
idx = arange(n)
return (idx,) * ndim
In [68]: np.diag_indices(4,2)
Out[68]: (array([0, 1, 2, 3]), array([0, 1, 2, 3]))
它只返回一个数组元组,arange 重复了n 次。它对于索引方阵的主对角线很有用,例如
In [69]: arr = np.arange(16).reshape(4,4)
In [70]: arr
Out[70]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [71]: arr[np.diag_indices(4,2)]
Out[71]: array([ 0, 5, 10, 15])
该应用程序使用两个形状匹配的数组直接索引。
它适用于其他形状 - 如果它们足够大。
np.diag 应用于同一个数组做同样的事情:
In [72]: np.diag(arr)
Out[72]: array([ 0, 5, 10, 15])
但它也允许偏移:
In [73]: np.diag(arr, 1)
Out[73]: array([ 1, 6, 11])
===
使用diag_indices 进行索引确实允许我们更改对角线:
In [78]: arr[np.diag_indices(4,2)] += 10
In [79]: arr
Out[79]:
array([[10, 1, 2, 3],
[ 4, 15, 6, 7],
[ 8, 9, 20, 11],
[12, 13, 14, 25]])
====
但我们不必使用diag_indices 来生成所需的索引数组:
In [80]: arr = np.arange(1,7).reshape(3,2)
In [81]: arr
Out[81]:
array([[1, 2],
[3, 4],
[5, 6]])
从第一 2 行和列中选择值:
In [82]: arr[np.arange(2), np.arange(2)]
Out[82]: array([1, 4])
In [83]: arr[np.arange(2), np.arange(2)] += 10
In [84]: arr
Out[84]:
array([[11, 2],
[ 3, 14],
[ 5, 6]])
对于不同的行选择:
In [85]: arr[np.arange(1,3), np.arange(2)] += 20
In [86]: arr
Out[86]:
array([[11, 2],
[23, 14],
[ 5, 26]])
advanced indexing 的相关文档部分与整数数组:https://numpy.org/doc/stable/reference/arrays.indexing.html#purely-integer-array-indexing