当前位置: 首页 > 面试题库 >

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

刘德义
2023-03-14
问题内容

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


问题答案:

如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])]。这样可以避免您必须输入所有这些额外的括号。



 类似资料:
  • 问题内容: 我有并想要一些函数,调用的结果是新数组。 问题答案: 看一眼

  • 问题内容: 我有一个变量,如下所示: 该变量中包含许多城镇数据。如何有效地从数据中提取第三个元素?我,下面会是什么? 如果我想将两个值都存储在数组中怎么办?那是 我是Java的新手。我希望有一种不使用for循环的方法。 问题答案: 在较新的浏览器上,您可以使用,否则可以避免使用循环。 但是for循环更兼容。

  • 问题内容: 指向数组的指针,比方说: 我无法访问该变量,上面的代码用于使其更加清晰。 另外,我知道数组的大小,但是不是恒定的,它会根据运行时而变化。 现在,我想使用已知的指针,大小以及数据类型初始化切片或数组。 我想出了以下代码: 但是这种方法是否可以进行内存复制(可能效率不高)? PS我还尝试了以下两种方法, 但它将在运行时失败,我现在知道其原因。 问题答案: 前言: 您应该知道:如果将指针作为

  • 创建一个数组切片,从 arr 数组的最后一个元素开始向前提取n个元素。 使用 Array.slice() 来创建一个从第 n 个元素开始从末尾的数组。 const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length); takeRight([1, 2, 3], 2); // [ 2, 3 ] takeRight([1,

  • 创建一个数组切片,从arr数组的起始元素开始提取n个元素。 使用 Array.slice() 创建一个数组包含第一个元素开始,到 n 个元素结束的数组。 const take = (arr, n = 1) => arr.slice(0, n); take([1, 2, 3], 5); // [1, 2, 3] take([1, 2, 3], 0); // []

  • 问题内容: 我正在使用Javascript(ES6)/ FaceBook进行反应,并尝试获取大小变化的数组的前3个元素。我想做相当于Linq take(n)。 在我的Jsx文件中,我有以下内容: 然后得到我尝试的前三个项目 这不起作用,因为地图没有设置功能。 你能帮忙吗? 问题答案: 我相信您正在寻找的是: