Python 使用循环修改np.diag的对角数组

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_索引

我一直在尝试查找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_索引只有两个参数,从外观上看,这两个参数都不能使我做到这一点。我是否使用了错误的工具来尝试实现这一点?如果是这样,我可以使用什么工具来创建穿过矩阵的不断变化的对角线数组?我正在寻找的东西,也将工作在更大的矩阵,如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,这就是为什么它不起作用