0
点赞
收藏
分享

微信扫一扫

[7]数据科学-【1】Numpy库

欢迎学习使用Python和NumPy库进行数据科学的教程!在本教程中,我将介绍NumPy的基础知识和功能,以帮助您开始使用NumPy进行数据分析和科学计算。

什么是NumPy?

NumPy是Python语言中用于数值计算的基础软件包。它提供了高性能的多维数组对象和相关工具,可以让我们轻松地处理数值数据。

NumPy最显著的特点之一是它的数组对象。这些数组可以是任意维度的,可以包含任意类型的数据。NumPy数组比Python原生的列表更快,更节省内存,并且在处理数值数据时提供了更多的灵活性和方便性。

在本教程中,我将展示NumPy如何工作以及如何使用它来处理数据。

安装NumPy

在使用NumPy之前,我们需要确保它已经安装在我们的机器上。NumPy可以通过pip安装,打开终端并输入以下命令:

pip install numpy

如果您使用的是Anaconda,NumPy通常已经安装好了。如果不是,您可以使用以下命令在Anaconda中安装:

conda install numpy

导入NumPy

在我们开始使用NumPy之前,我们需要将其导入到我们的Python程序中。我们可以使用以下命令导入NumPy:

import numpy as np

在这个例子中,我们将NumPy作为np别名导入。这是Python中的一种常见惯例,它使我们可以轻松地引用NumPy库中的任何函数或属性。

NumPy数组

现在我们已经安装并导入了NumPy,我们可以开始使用它了。NumPy的核心组件是它的多维数组对象。NumPy数组是一个由相同类型的元素组成的网格,并且可以具有任意数量的维度。

创建NumPy数组

创建一个NumPy数组的最简单方法是使用np.array()函数。这个函数接受一个序列,例如一个列表或元组,并将其转换为NumPy数组。下面是一个例子:

import numpy as np

a = np.array([1, 2, 3])
print(a)

输出:

[1 2 3]

在这个例子中,我们创建了一个包含三个整数的NumPy数组。

数组的形状和维度

NumPy数组的形状和维度可以使用shape属性访问。形状是一个整数元组,表示每个维度的大小。维度是数组的数量。

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape)

输出:

(2, 3)

在这个例子中,我们创建了一个包含两行和三列的二维NumPy数组。我们可以使用shape属性访问这个数组的形状,得到一个元组(2, 3),表示这个数组有两行和三列。

我们也可以使用ndim属性访问NumPy数组的维度。例如,对于上面的数组,我们可以这样做:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.ndim)

输出:

2

在这个例子中,我们得到的结果是2,因为这个数组有两个维度。

数组的类型

NumPy数组的元素类型可以使用dtype属性访问。这个属性返回一个描述数组数据类型的NumPy对象。

import numpy as np

a = np.array([1, 2, 3])
print(a.dtype)

输出:

int64

在这个例子中,我们创建了一个包含三个整数的NumPy数组。我们可以使用dtype属性访问数组的类型,得到一个NumPy对象int64,表示这个数组的元素类型是64位整数。

数组的索引和切片

NumPy数组的元素可以使用索引和切片进行访问。和Python的列表一样,NumPy数组的索引从0开始。

import numpy as np

a = np.array([1, 2, 3])
print(a[0])

输出:

1

在这个例子中,我们访问了数组a的第一个元素,即1。

对于多维数组,我们可以使用逗号分隔的索引来访问特定的元素。

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
print(a[0, 1])

输出:

2

在这个例子中,我们访问了数组a的第一行第二列的元素,即2。

我们也可以使用切片来访问数组的一个子集。例如,我们可以使用以下代码访问数组a的前两行和前两列:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a[:2, :2])

输出:

[[1 2]
 [4 5]]

在这个例子中,我们使用[:2, :2]选择了数组a的前两行和前两列,得到了一个二维数组。

数组的运算

NumPy数组可以进行各种运算,包括加法、减法、乘法和除法。对于两个数组的运算,NumPy将对它们的元素进行操作。

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b)

输出:

[5 7 9]

在这个例子中,我们对数组a和数组b进行了加法运算,得到了一个新的数组[5 7 9],它的每个元素都是原数组对应位置的元素之和。

我们也可以对整个数组进行运算。例如,我们可以对数组中的所有元素求和,如下所示:

import numpy as np

a = np.array([1, 2, 3])
print(np.sum(a))

输出:

6

在这个例子中,我们使用NumPy的sum函数对数组a中的所有元素进行求和,得到结果6。

除了加法和求和,NumPy还提供了许多其他的数学函数,如sin、cos、tan、exp、log等等。我们可以像下面这样使用这些函数:

import numpy as np

a = np.array([0, np.pi/2, np.pi])
print(np.sin(a))

输出:

[0.0000000e+00 1.0000000e+00 1.2246468e-16]

在这个例子中,我们创建了一个包含三个值的NumPy数组[0, pi/2, pi],并使用NumPy的sin函数对这个数组中的所有元素进行求正弦值的运算。输出结果是一个包含三个值的NumPy数组。

广播

在进行元素级运算时,如果两个数组的形状不同,NumPy会尝试广播它们以使它们具有相同的形状。广播的规则如下:

  • 如果两个数组的维度不同,NumPy将在较小的数组周围添加一个大小为1的维度,直到两个数组的维度相同。
  • 如果两个数组在某个维度上的大小不同,但其中一个数组的大小为1,那么NumPy将对该数组进行重复,使其大小与另一个数组的大小相同。
  • 如果两个数组在某个维度上的大小不同,并且两个数组的大小都不为1,那么NumPy将引发一个错误。

下面是一个广播的例子:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([10, 20, 30])
print(a + b)

输出:

[[11 22 33]
 [14 25 36]]

在这个例子中,我们对一个二维数组a和一个一维数组b进行了加法运算。由于b的形状与a的一行相同,NumPy将b沿着第一维进行广播,将其复制了两次,然后对两个数组进行了加法运算。

索引和切片的高级用法

除了基本的索引和切片之外,NumPy还提供了一些高级的索引和切片功能,这些功能可以帮助我们更方便地访问和修改数组中的数据。

整数数组索引

我们可以使用整数数组来对数组进行索引,这种索引方式被称为整数数组索引。下面是一个例子:

import numpy as np

a = np.array([1, 2, 3, 4, 5])
print(a[[0, 2, 4]])

输出:

[1 3 5]

在这个例子中,我们使用一个包含索引值的整数数组来对数组a进行索引,得到了一个新的数组[1, 3, 5],它包含了原数组中下标为0、2、4的元素。

我们还可以使用整数数组来进行切片,例如:

import numpy as np

a = np.array([1, 2, 3, 4, 5])
print(a[[1, 3]][::-1])

输出:

[4 2]

在这个例子中,我们先使用整数数组[1, 3]对数组a进行切片,得到一个新的数组[2, 4],然后使用切片[::-1]对这个新数组进行反转,得到最终的结果[4, 2]。

布尔数组索引

除了整数数组索引之外,NumPy还支持使用布尔数组来对数组进行索引,这种索引方式被称为布尔数组索引。下面是一个例子:

import numpy as np

a = np.array([1, 2, 3, 4, 5])
mask = np.array([True, False, True, False, True])
print(a[mask])

输出:

[1 3 5]

在这个例子中,我们使用一个布尔数组[True, False, True, False, True]来对数组a进行索引,得到了一个新的数组[1, 3, 5],它包含了原数组中所有在布尔数组中对应位置上为True的元素。

我们还可以使用逻辑运算符和比较运算符来生成布尔数组,例如:

import numpy as np

a = np.array([1, 2, 3, 4, 5])
mask = (a > 2) & (a < 5)
print(a[mask])

输出:

[3 4]

在这个例子中,我们使用逻辑运算符&和比较运算符>和<来生成一个布尔数组,它指示了原数组中所有在2和5之间的元素。然后,我们使用这个布尔数组来对原数组进行索引,得到了一个新的数组[3, 4]。

切片对象

除了普通的切片之外,NumPy还支持使用切片对象来进行高级切片操作。切片对象可以包含多个步长和维度信息,可以帮助我们更精细地控制切片操作。下面是一个例子:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
s = np.s_[::2, 1:]
print(a[s])

输出:

[[2 3]
 [8 9]]

在这个例子中,我们首先定义了一个二维数组a,然后使用np.s_函数创建了一个切片对象s,这个切片对象包含了两个切片,第一个切片指示了行方向上每隔一行取一个元素,第二个切片指示了列方向上从第二列开始到末尾的所有元素。最后,我们使用这个切片对象来对数组a进行切片,得到了一个新的数组[[2, 3], [8, 9]]。

统计函数

NumPy中提供了许多用于统计分析的函数,例如:

  • np.sum:计算数组所有元素的和;
  • np.mean:计算数组所有元素的平均值;
  • np.std:计算数组所有元素的标准差;
  • np.var:计算数组所有元素的方差;
  • np.min:找到数组中的最小值;
  • np.max:找到数组中的最大值;
  • np.argmin:找到数组中最小值的索引;
  • np.argmax:找到数组中最大值的索引;
  • np.median:计算数组所有元素的中位数。

这些函数都可以接受一个可选的axis参数,用于指定统计的维度。例如:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.mean(a, axis=0))  # 沿着行方向求均值
print(np.mean(a, axis=1))  # 沿着列方向求均值

输出:

[4. 5. 6.]
[2. 5. 8.]

在这个例子中,我们首先定义了一个二维数组a,然后使用np.mean函数计算了数组在行方向和列方向上的均值。在第一个调用中,axis=0表示沿着行方向进行均值计算,即求每一列的均值;在第二个调用中,axis=1表示沿着列方向进行均值计算,即求每一行的均值。

随机数函数

NumPy中还提供了一些用于生成随机数的函数,例如:

  • np.random.rand:生成指定形状的数组,其中的元素为从区间(0, 1)中均匀分布的随机数;
  • np.random.randn:生成指定形状的数组,其中的元素为从标准正态分布中抽取的随机数;
  • np.random.randint:生成指定形状的数组,其中的元素为从指定区间内随机抽取的整数;
  • np.random.random_sample:生成指定形状的数组,其中的元素为从区间(0, 1)中均匀分布的随机数;
  • np.random.choice:从给定的一维数组中随机抽取元素。

数组形状变换

在NumPy中,可以使用reshape函数将一个数组的形状改变为另一个形状,例如:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = a.reshape(9)
c = a.reshape(1, 9)
d = a.reshape(9, 1)
print(b)
print(c)
print(d)

输出:

[1 2 3 4 5 6 7 8 9]
[[1 2 3 4 5 6 7 8 9]]
[[1]
 [2]
 [3]
 [4]
 [5]
 [6]
 [7]
 [8]
 [9]]

在这个例子中,我们首先定义了一个二维数组a,然后使用reshape函数将a的形状分别改变为(9,)、(1, 9)和(9, 1)。注意,这里使用reshape函数改变数组的形状时,新数组的元素数量必须与原数组的元素数量一致。

此外,NumPy还提供了一些用于改变数组形状的函数,例如:

  • np.ravel:将一个多维数组展平成一维数组;
  • np.expand_dims:在指定的维度上为数组增加一个维度;
  • np.transpose:将数组的轴顺序反转。

下面是一个例子:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.ravel(a)
c = np.expand_dims(a, axis=0)
d = np.transpose(a)
print(b)
print(c)
print(d)

输出:

[1 2 3 4 5 6 7 8 9]
[[[1 2 3]
  [4 5 6]
  [7 8 9]]]
[[1 4 7]
 [2 5 8]
 [3 6 9]]

在这个例子中,我们首先定义了一个二维数组a,然后使用np.ravel函数将a展平成了一维数组b,使用np.expand_dims函数在第0个维度上为a增加了一个维度,得到了三维数组c,使用np.transpose函数将a的轴顺序反转,得到了转置矩阵d。

数组拼接

在NumPy中,可以使用concatenate函数将两个或多个数组沿着指定轴拼接起来,例如:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[7, 8, 9], [10, 11, 12]])
c = np.concatenate([a, b], axis=0)
d = np.concatenate([a, b], axis=1)
print(c)
print(d)

输出:

[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
[[ 1  2  3  7  8  9]
 [ 4  5  6 10 11 12]]

在这个例子中,我们首先定义了两个二维数组a和b,然后使用np.concatenate函数将a和b沿着第0个轴拼接起来得到新数组c,将a和b沿着第1个轴拼接起来得到新数组d。

此外,NumPy还提供了一些其他的数组拼接函数,例如:

  • np.vstack:将多个数组沿着垂直方向拼接;
  • np.hstack:将多个数组沿着水平方向拼接;
  • np.dstack:将多个数组沿着深度方向拼接。

下面是一个例子:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[7, 8, 9], [10, 11, 12]])
c = np.vstack([a, b])
d = np.hstack([a, b])
e = np.dstack([a, b])
print(c)
print(d)
print(e)

输出:

[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
[[ 1  2  3  7  8  9]
 [ 4  5  6 10 11 12]]
[[[ 1  7]
  [ 2  8]
  [ 3  9]]
 [[ 4 10]
  [ 5 11]
  [ 6 12]]]

在这个例子中,我们首先定义了两个二维数组a和b,然后使用np.vstack函数将a和b垂直方向拼接起来得到新数组c,使用np.hstack函数将a和b水平方向拼接起来得到新数组d,使用np.dstack函数将a和b深度方向拼接起来得到新数组e。

数组分裂

在NumPy中,可以使用split函数将一个数组沿着指定轴分裂成多个数组,在此不做过多编写,大家可以深入的学习。

总结

在本教程中,我们学习了NumPy库的基本用法。我们首先介绍了NumPy数组的创建方法和属性,包括创建一维和多维数组、数组的形状、元素类型等。然后我们学习了NumPy数组的基本运算,包括数组的加减乘除、矩阵乘法、数组的逻辑运算、元素访问等。接着,我们介绍了NumPy数组的高级运算,包括广播、索引、切片、排序、统计等。最后,我们学习了NumPy数组的合并和分裂,包括concatenate、stack、split等函数。

NumPy库是Python中数据科学领域的重要工具,可以方便地进行数组操作和数值计算。掌握NumPy的基本用法,对于学习和实践数据科学都有很大帮助。但是,NumPy还有很多高级用法和功能,需要更深入的学习和实践才能掌握。

举报

相关推荐

0 条评论