【问题标题】:Accessing matrix in Python by an array of indices [duplicate]通过索引数组访问Python中的矩阵[重复]
【发布时间】:2020-11-18 19:51:45
【问题描述】:

我对 Python 比较陌生,非常感谢您的帮助!

假设我有两个方阵 - 一个大的 M 和一个小的 K - 和一个整数数组索引 ind,不一定排序。 ind 的长度与K 的尺寸相匹配。在 Octave/MATLAB 中,我可以轻松做到这一点:

M(ind, ind) = K

这会将 K 的所有组件分配到与索引 ind 对应的 M 的那些位置。这通常用于有限元计算。

有没有办法在 Python 中优雅地做同样的事情?你可以假设我的 MK 是通过操作构造的 NumPy 数组:

M = np.zeros((12, 12))
K = np.zeros((6, 6))

我在这些矩阵上做了一些工作,并用数据填充了它们。我的ind 数组也是一个 NumPy 数组。 但是,当我做类似的事情时

M[ind, ind] = K

我收到shape mismatch 错误。将ind.tolist() 而不是ind 插入M 不会改变任何东西。

感谢您的建议!

【问题讨论】:

  • numpy M[ind, ind] 访问“对角线”,而在 MATLAB 中它定义了一个块。 M[ind[:,None],ind] 获取块,针对行(一维数组)广播列向量。实际上,在 MATLAB 中容易做的事情在 numpy 中要难一些。但反之亦然; MATLAB 需要一个额外的函数来获取对角线的“平面”索引。

标签: python arrays numpy indexing


【解决方案1】:

你正在寻找这个:

M[np.ix_(ind,ind)] = K

示例:

M = np.zeros((12, 12))
K = np.ones((6, 6))
ind = np.arange(6)

输出:

[[1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0.]
 [1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0.]
 [1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0.]
 [1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0.]
 [1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0.]
 [1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

【讨论】:

    【解决方案2】:

    如果你使用的是 numpy 数组,可以直接使用以下语法进行 donde:

    import numpy as np
    
    M = np.zeros((12, 12))
    K = np.ones((6, 6))
    
    M[:6, :6] = K
    # This is equivalent to:
    # M[0:6, 0:6] = K
    

    M 将如下所示:

    array([[1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.],
           [1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.],
           [1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.],
           [1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.],
           [1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.],
           [1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
    

    这里有更多关于 python 中切片索引的信息

    https://www.pythoncentral.io/how-to-slice-listsarrays-and-tuples-in-python/

    【讨论】:

    • 有没有办法插入给定的索引numpy数组? 0:6 不是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2015-11-29
    • 2018-11-23
    • 2015-08-14
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多