【发布时间】: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 数组”,那么它不适用于列表。