代码之家  ›  专栏  ›  技术社区  ›  mathemagician

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

  •  1
  • mathemagician  · 技术社区  · 7 年前

    我有一个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 回复  |  直到 7 年前
        1
  •  2
  •   juanpa.arrivillaga    7 年前

    广播是你想做的。虽然对于像您这样的小阵列来说,这没有什么不同,但它会产生

    >>> 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]])