Python 使用循环修改np.diag的对角数组
我一直在尝试查找np.diag_索引是如何工作的,对于它们的示例,但是它的文档有点轻。我知道这会通过你的矩阵创建一个对角线数组,但是我想改变对角线数组,我想用一个循环来改变它的尺寸,或者沿着这些线做些什么 即。 假设我们有一个3x2矩阵:Python 使用循环修改np.diag的对角数组,python,arrays,numpy,Python,Arrays,Numpy,我一直在尝试查找np.diag_索引是如何工作的,对于它们的示例,但是它的文档有点轻。我知道这会通过你的矩阵创建一个对角线数组,但是我想改变对角线数组,我想用一个循环来改变它的尺寸,或者沿着这些线做些什么 即。 假设我们有一个3x2矩阵: [[1 2] [3 4] [5 6]] 现在,如果我使用np.diag_索引,它将形成一个从0,0开始,经过1,1的对角线数组 [1 4] 但是,我希望这个对角数组将1向下移动。现在它从0,1开始,经过1,2 [3 6] 然而,np.diag_索引
[[1 2]
[3 4]
[5 6]]
现在,如果我使用np.diag_索引,它将形成一个从0,0开始,经过1,1的对角线数组
[1 4]
但是,我希望这个对角数组将1向下移动。现在它从0,1开始,经过1,2
[3 6]
然而,np.diag_索引只有两个参数,从外观上看,这两个参数都不能使我做到这一点。我是否使用了错误的工具来尝试实现这一点?如果是这样,我可以使用什么工具来创建穿过矩阵的不断变化的对角线数组?我正在寻找的东西,也将工作在更大的矩阵,如200x50 diag_索引的代码很简单,非常简单,我从未使用过它:
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_索引编制索引确实允许我们更改该对角线:
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_索引来生成所需的索引数组:
In [80]: arr = np.arange(1,7).reshape(3,2)
In [81]: arr
Out[81]:
array([[1, 2],
[3, 4],
[5, 6]])
从前两行和前两列中选择值:
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]])
有关整数数组高级索引的相关文档部分:diag_索引的代码非常简单,我从未使用过它:
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_索引编制索引确实允许我们更改该对角线:
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_索引来生成所需的索引数组:
In [80]: arr = np.arange(1,7).reshape(3,2)
In [81]: arr
Out[81]:
array([[1, 2],
[3, 4],
[5, 6]])
从前两行和前两列中选择值:
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]])
有关整数数组高级索引的相关文档部分:np.diag正是我所要寻找的,尽管看起来索引是通过行而不是列进行的,但我可以将矩阵转置以使其工作。非常感谢。我相信diag也接受负偏移量。我在帖子格式中添加了我的评论,使得这里的帖子代码很难看。请忽略我最后的评论。我不能拼写我把diag拼写为daig,这就是为什么它不工作的原因。diag正是我要找的,虽然,看起来索引是通过行而不是列,但我可以转换我的矩阵使它工作。非常感谢。我相信diag也接受负偏移量。我在帖子格式中添加了我的评论,使得这里的帖子代码很难看。请忽略我最后的评论。我不会拼写我把diag拼写成daig,这就是为什么它不起作用