微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

正如 sven 提到的,x[[[0],[2]],[1,3]]将返回与第 1 列和第 3 列匹配的第 0 行和第 2 行,同时x[[0,2],[1,3]]将返回数组中的值 x[0,1] 和 x[2,3]。

做我给出的第一个例子有一个有用的功能numpy.ix_. 你可以用我的第一个例子做同样的事情x[numpy.ix_([0,2],[1,3])]。这可以使您不必输入所有这些额外的括号。

解决方法

我想切片一个 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]][:,3]]
Out[61]: 
array([[ 5,15]])

第一个问题是它很难阅读,尽管我可以忍受。如果有人有更好的解决方案,我当然想听听。

另一件事是我在一个论坛上读到,用数组索引数组会强制 NumPy
制作所需数组的副本,因此在处理大型数组时,这可能会成为一个问题。为什么会这样/这种机制是如何工作的?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。