我想要切分一个NumPy nxn数组。我想要提取该数组中任意选择的m行和列(即行/列数没有任何模式),使其成为一个新的mxm数组。对于此示例,让我们假设数组是4x4,我想要从中提取一个2x2数组。
这是我们的数组:
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]]
要删除的行和列是相同的。最容易的情况是当我想要提取一个2x2的子矩阵,该子矩阵位于开头或结尾,即:
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复制所需的数组,因此当处理大型数组时,这可能会成为一个问题。为什么会这样 / 这个机制是如何工作的呢?