2015-02-18 42 views
0

我想要一个矩阵并修改它的块。例如,对于4x4矩阵,{1,2},{1,2}块位于左上象限(下面的[0,1; 4,5])。如果我们重新排列矩阵使得{4,1},{4,1}块是左上象限,所以第4行/列在位置1和位置2的第1位。在Python中修改块矩阵

让我们制作这样一个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 

一样。

这是为什么?这是第二种可能性最高的方法吗?谢谢!

+0

如果C是一个numpy数组,那么'a [C [:,None],C]'也可以。 – 2015-02-18 00:55:44

+0

Ashwini:当我尝试我得到'TypeError:列表索引必须是整数,而不是元组'? – user65257 2015-02-18 01:11:45

+1

你想'a [np.ix_(C,C)] = b' – 2015-02-18 01:12:01

回答

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和哪些复制。简单的答案是,如果要修改值,只使用一层索引。

索引文件:

Thus, x[ind1,...,ind2,:] acts like x[ind1][...,ind2,:] under basic slicing.

因此a[1][3] += 7作品。但文档也警告

Warning The above is not true for advanced indexing.