【问题标题】:Modifying block matrices in Python在 Python 中修改块矩阵
【发布时间】:2015-02-18 00:49:54
【问题描述】:

我想获取一个矩阵并修改它的块。例如,对于 4x4 矩阵,{1,2},{1,2} 块位于左上象限(下方的 [0,1;4,5])。如果我们重新排列矩阵,则 {4,1},{4,1} 块是左上象限,因此第 4 行/列位于位置 1,第 1 行/列位于位置 2。

让我们制作这样一个 4x4 矩阵:

a = np.arange(16).reshape(4, 4)
print(a)

## [[ 0  1  2  3]
##  [ 4  5  6  7]
##  [ 8  9 10 11]
##  [12 13 14 15]]

现在选择块的一种方法,我预先指定我想要的行/列,如下所示:

C=[3,0]
a[[[C[0],C[0]],[C[1],C[1]]],[[C[0],C[1]],[C[0],C[1]]]]

## array([[15, 12],
##        [ 3,  0]])

这是另一种方式:

a[C,:][:,C]

## array([[15, 12],
##        [ 3,  0]])

但是,如果我有一个 2x2 数组,则将其称为 b,设置

a[C,:][:,C]=b

没用,但是

a[[[C[0],C[0]],[C[1],C[1]]],[[C[0],C[1]],[C[0],C[1]]]]=b

会。

这是为什么?这第二种方式是最有效的吗?谢谢!

【问题讨论】:

  • 如果 C 是一个 numpy 数组,那么 a[C[:,None], C] 也可以。
  • Ashwini:当我尝试得到“TypeError:列表索引必须是整数,而不是元组”?
  • 你想要a[np.ix_(C, C)] = b
  • @user65257 我确实说过:“如果 C 是一个 numpy 数组”,那么它不适用于列表。

标签: python numpy matrix


【解决方案1】:

numpy 文档中的相关部分是 http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#purely-integer-array-indexing 高级数组索引。

根据您的情况调整该示例:

In [213]: rows=np.array([[C[0],C[0]],[C[1],C[1]]])
In [214]: cols=np.array([[C[0],C[1]],[C[0],C[1]]])

In [215]: rows
array([[3, 3],
       [0, 0]])

In [216]: cols
array([[3, 0],
       [3, 0]])

In [217]: a[rows,cols]
array([[15, 12],
       [ 3,  0]])

由于广播,您不需要重复重复索引,因此:

a[[[3],[0]],[3,0]]

做得很好。 np.ix_ 是产生这样一对的便捷函数:

np.ix_(C,C) 
(array([[3],
        [0]]), 
 array([[3, 0]]))

因此,一个简短的答案是:

a[np.ix_(C,C)]

一个相关的函数是meshgrid,它构造全索引数组:

a[np.meshgrid(C,C,indexing='ij')]

np.meshgrid(C,C,indexing='ij') 与您的[rows, cols] 相同。有关'ij' 参数的意义,请参阅函数文档。

np.meshgrid(C,C,indexing='ij',sparse=True) 产生与np.ix_ 相同的数组对。

我认为计算速度没有太大差异。显然,有些需要您少打字。

a[:,C][C,:] 用于查看值,但不适用于修改它们。细节与制作views 和制作副本的操作有关。简单的答案是,如果要修改值,只使用一层索引。

索引文档:

因此,x[ind1,...,ind2,:] 在基本切片下的行为类似于 x[ind1][...,ind2,:]。

因此a[1][3] += 7 有效。但是文档也警告

警告 以上不适用于高级索引。

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多