我想切割一个 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 复制所需的数组,因此在处理大型数组时,这可能会成为一个问题。为什么会这样/这个机制是如何工作的?