NumPy 2d数组的切片,或者如何从nxn数组(n>m)中提取一个mxm子矩阵?
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复制所需的数组,因此在处理大数组时可能会成为一个问题。为什么会这样/这个机制是如何工作的?