如何使用行和列上的迭代在Python中填充矩阵

时间:2017-08-30 17:50:44

标签: python numpy matrix iteration

所以我有一个5个整数v的数组和10个整数v的另一个数组。 我有一个5乘10的矩阵P,我想要填充(P)ij = v[i] + u[j]

我试过了:

P = np.empty((len(asset_grid),len(asset_grid)))
for i in range(asset_grid):
    for j in range(asset_grid):
        P[i,j] = asset_grid[i] + asset_grid[j]

但它给了我一个错误

TypeError: only integer arrays with one element can be converted to an index

我应该如何在Python中执行此操作。如果我的方法太天真,我很抱歉,我习惯了Matlab,现在慢慢学习Python。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

广播就是你想要做的。虽然对于像你这样的小型数组,它没有什么区别,但它与较大的数组产生了重要的差异:

>>> arr1 = np.arange(5)
>>> arr2 = np.arange(10,20)
>>> arr1[:,None] + arr2
array([[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
       [12, 13, 14, 15, 16, 17, 18, 19, 20, 21],
       [13, 14, 15, 16, 17, 18, 19, 20, 21, 22],
       [14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])

通常使用numpy,您希望避免对行和列进行迭代,并使用向量化/广播操作。这就是速度改进的实际来源。

所以,根据你的评论进行详细阐述:

  
    
      

假设P_ij是x的第i个元素,增加到4次幂减去y的第j个元素,增加到2次幂

    
  

一般来说,Python使用通常的Python运算符支持你想要的矢量化大多数算术运算:

>>> arr1[:, None]**4 - arr2**2
array([[-100, -121, -144, -169, -196, -225, -256, -289, -324, -361],
       [ -99, -120, -143, -168, -195, -224, -255, -288, -323, -360],
       [ -84, -105, -128, -153, -180, -209, -240, -273, -308, -345],
       [ -19,  -40,  -63,  -88, -115, -144, -175, -208, -243, -280],
       [ 156,  135,  112,   87,   60,   31,    0,  -33,  -68, -105]])