NumPy 2d数组的切片,或者如何从nxn数组(n>m)中提取一个mxm子矩阵?

7 浏览
0 Comments

NumPy 2d数组的切片,或者如何从nxn数组(n>m)中提取一个mxm子矩阵?

我想切割一个NumPy的n×n数组。我想提取该数组的任意选择的m行和列(即行/列的数量没有任何模式),并将其作为一个新的m×m数组。以这个例子来说,假设数组是4×4的,我想从中提取一个2×2的数组。

这是我们的数组:

from numpy import *
x = range(16)
x = reshape(x,(4,4))
print x
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

要删除的行和列是相同的。最简单的情况是当我想从开头或结尾提取一个2×2的子矩阵时,即:

In [33]: x[0:2,0:2]
Out[33]: 
array([[0, 1],
       [4, 5]])
In [34]: x[2:,2:]
Out[34]: 
array([[10, 11],
       [14, 15]])

但是如果我需要删除其他混合的行/列呢?如果我需要删除第一行和第三行,从而提取子矩阵[[5,7],[13,15]]?行/列的组合可以是任意的。我在某个地方读到,只需要使用行和列的索引数组/列表来索引数组,但似乎行不通:

In [35]: x[[1,3],[1,3]]
Out[35]: array([ 5, 15])

我找到了一种方法,即:

In [61]: x[[1,3]][:,[1,3]]
Out[61]: 
array([[ 5,  7],
       [13, 15]])

首先,这种方法很难阅读,尽管我可以接受。如果有更好的解决方法,我当然希望听到。另一个问题是,我在一个论坛上读到,使用数组对数组进行索引会强制NumPy复制所需的数组,因此在处理大数组时可能会成为一个问题。为什么会这样/这个机制是如何工作的?

0