5种提取特定的NumPy列的最佳方法

1,323 阅读6分钟

问题的提出和解决方案概述

在这篇文章中,你将学习如何在Python中从NumPy数组中提取特定的列或其子集。

通常情况下,需要从一个较大的数据集中提取一个子集的数据。这个子集可以是一个预先确定的列数或行数。这些例子告诉你如何提取这些数据。


💬 问题是:我们如何编写代码来完成这个任务?

我们可以通过以下方式之一来完成这项任务。


准备工作

在前进之前,请确保NumPy库已经安装在电脑上。

然后,在每个脚本的顶部添加以下代码。这段代码将使本文中的代码能够无误运行。

import numpy as np 

导入NumPy库后,我们可以通过调用短码(np)来引用这个库,如上所示。


方法1:使用np.array()和切分法

这个NumPy方法使用slicing,从一个数据集中提取一个特定的子集。下面的代码可以用在有大量数据集的生产环境中。

data = np.array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
                 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
                 [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
                 [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]])

subset = data[:, 1:6:2] 
print(subset)

以上,一个 np.array()函数用来声明一个包含少量整数样本的2D(二维)NumPy数组。这可以保存到data

接下来,使用切片(data[:, 1:6:2])提取上述data 的一个子集,包含所有的行和第1 、3、5 ,如下所示。

  • 通过调用data[: ] ,提取出data 的所有
  • 一个逗号(,)被用来分隔切片。在这种情况下,将行 提取[:]与 提取[1:6:2]
  • 提取从第1列到第5列(stop-1)开始,跳过每2列。一旦达到停止位置(6-1),切片就完成并保存到subset

结果被输出到终端。

[[ 1 3 5]
[11 13 15]
[21 23 25]
[31 33 35]]

将这个输出与原始的 np.array()显示了切片是多么的容易!一个真正的Pythonic方法!


方法2:使用np.array()和np.ix_

这个NumPy方法使用 np.array()np.ix_函数和切片,从一个数据集中提取一个行和列的子集。这个选项也可以用在有大量数据集的生产环境中。

data = np.array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
                 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
                 [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
                 [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]])

subset = data[np.ix_([2,3], [2,5])] 
print(subset)

上面,一个 np.array()函数被用来声明一个2D(二维)NumPy数组,其中包含一个小的整数样本。这就保存到了data

接下来,使用切片法提取数据,保存到subset ,并输出到终端。

[[22 25]
[32 35]]

方法3:使用np.array()和np.range()

这个NumPy方法使用了 np.array()np.arange()来从一个数据集中提取一个子集。这个选项只适用于1D(一维)NumPy数组。

data = np.array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9])
subset = np.arange(3, 10, 3)
print(subset)

上面,一个 np.array()函数用来声明一个一维(one-dimensional)NumPy数组,其中包含一个小的整数样本。这就保存到了data

接下来。 np.arange()被使用并传递了以下参数。

  • 3的起始位置。
  • 9的停止位置(stop-1)。
  • 步进位置为3。

结果输出到终端。

[3 6 9]

方法4:使用 使用np.array(),np.reshape()slicing

这个NumPy方法使用了Use np.array(), np.reshape()切片来从数据集中提取一个子集。这个选项也可以用在有大量数据集的生产环境中。

data = np.array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
                 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
                 [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
                 [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]])

reworked = np.arange(25).reshape(5,5)
print(reworked)

subset = reworked[:,3]
print(subset)

上面,一个 np.array()函数被用来声明一个2D(二维)NumPy数组,其中包含一个小的整数采样。这将保存到data

接下来,data 进行重塑,并输出到终端,显示新的变换(5个数组。每个数组包含5个元素)。

[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]]

从重塑的data ,用切片法从每个数组中提取元素[3],然后保存到一维数组subset ,输出到终端。

[ 3 8 13 18 23]

意外收获

我们有一个CSV文件,包含五(5)个来自Finxter学院的用户样本。这些列是一个ID,谜题的正确率和错误率。使用NumPy,如何提取这些数据的一个子集?

scores.csv的内容

30022145,1915,68
30022192,1001,45
30022331,158,9
30022345,1415,23
30022359,1950,47
csv = np.loadtxt('scores.csv', delimiter=',', dtype=int)
csv = csv.reshape(3,5)
print(csv)

subset = csv[:, 4]
print(subset)

以上,使用 np.loadtxt()并传递给它以下参数。

  • 要读入CSV文件。在本例中,scores.csv
  • 字段分隔符。在本例中,是一个逗号 (,)。
  • 设置数据类型为整数 (dtype-int)。

接下来,调用csv.reshape() ,并传递两(2)个参数。

  • CSV文件中列的总数 (3)。
  • CSV文件中的总行数 (5)。

然后,重塑的NumPy数组被输出到终端。

[[30022145 1915 68 30022192 1001]
[ 45 30022331 158 9 30022345]
[ 1415 23 30022359 1950 47]]

然而,我们想提取这个数据的一个子集。在这方面,下面一行csv[:, 4] ,使用切片法提取数据,并将其保存到subset

[ 1001 30022345 47]

总结

这五(5)种从NumPy数组中提取数据的方法应该给你足够的信息来选择适合你编码要求的最佳方法。

祝您好运,编码愉快!