NumPy 简介
什么是 NumPy?
NumPy 是用于处理数组的 python 库。
它还拥有在线性代数、傅立叶变换和矩阵领域中工作的函数。
NumPy 由 Travis Oliphant 于 2005 年创建。它是一个开源项目,您可以自由使用它。
NumPy 指的是数值 Python(Numerical Python)。
为何使用 NumPy?
在 Python 中,我们有满足数组功能的列表,但是处理起来很慢。
NumPy 旨在提供一个比传统 Python 列表快 50 倍的数组对象。
NumPy 中的数组对象称为 ndarray
,它提供了许多支持函数,使得利用 ndarray
非常容易。
数组在数据科学中非常常用,因为速度和资源非常重要。
数据科学:计算机科学的一个分支,研究如何存储、使用和分析数据以从中获取信息。
为什么 NumPy 比列表快?
与列表不同,NumPy 数组存储在内存中的一个连续位置,因此进程可以非常有效地访问和操纵它们。
这种行为在计算机科学中称为引用的局部性。
这是 NumPy 比列表更快的主要原因。它还经过了优化,可与最新的 CPU 体系结构一同使用。
NumPy 用哪种语言编写?
NumPy 是一个 Python 库,部分用 Python 编写,但是大多数需要快速计算的部分都是用 C 或 C ++ 编写的。
安装 NumPy
如果您已经在系统上安装了 Python 和 PIP,那么安装 NumPy 非常容易。
请使用这条命令安装它:
C:\Users\Your Name>pip install numpy
导入 NumPy
安装 NumPy 后,通过添加 import
关键字将其导入您的应用程序:
import numpy
现在,Numpy 已导入并可以使用。
实例
import numpy
arr = numpy.array([1, 2, 3, 4, 5])
print(arr)
NumPy as np
NumPy 通常以 np
别名导入。
别名:在 Python 中,别名是用于引用同一事物的替代名称。
请在导入时使用 as
关键字创建别名:
import numpy as np
现在,可以将 NumPy 包称为 np
而不是 numpy
。
实例
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr)
检查 NumPy 版本
版本字符串存储在 __version__
属性中。
实例
import numpy as np
print(np.__version__)
创建 NumPy ndarray 对象
NumPy 用于处理数组。 NumPy 中的数组对象称为 ndarray
。
我们可以使用 array()
函数创建一个 NumPy ndarray
对象。
实例
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr)
print(type(arr))
type(): 这个内置的 Python 函数告诉我们传递给它的对象的类型。像上面的代码一样,它表明 arr
是 numpy.ndarray
类型。
要创建 ndarray
,我们可以将列表、元组或任何类似数组的对象传递给 array()
方法,然后它将被转换为 ndarray
:
实例
使用元组创建 NumPy 数组:
import numpy as np
arr = np.array((1, 2, 3, 4, 5))
print(arr)
数组中的维
数组中的维是数组深度(嵌套数组)的一个级别。
嵌套数组:指的是将数组作为元素的数组。
0-D 数组
0-D 数组,或标量(Scalars),是数组中的元素。数组中的每个值都是一个 0-D 数组。
实例
用值 61 创建 0-D 数组:
import numpy as np
arr = np.array(61)
print(arr)
1-D 数组
其元素为 0-D 数组的数组,称为一维或 1-D 数组。
这是最常见和基础的数组。
实例
创建包含值 1、2、3、4、5、6 的 1-D 数组:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
print(arr)
2-D 数组
其元素为 1-D 数组的数组,称为 2-D 数组。
它们通常用于表示矩阵或二阶张量。
NumPy 有一个专门用于矩阵运算的完整子模块 numpy.mat
。
实例
创建包含值 1、2、3 和 4、5、6 两个数组的 2-D 数组:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
检查维数?
NumPy 数组提供了 ndim
属性,该属性返回一个整数,该整数会告诉我们数组有多少维。
实例
检查数组有多少维:
import numpy as np
a = np.array(42)
b = np.array([1, 2, 3, 4, 5])
c = np.array([[1, 2, 3], [4, 5, 6]])
d = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])
print(a.ndim)
print(b.ndim)
print(c.ndim)
print(d.ndim)
NumPy 数组索引
访问数组元素
数组索引等同于访问数组元素。
您可以通过引用其索引号来访问数组元素。
NumPy 数组中的索引以 0 开头,这意味着第一个元素的索引为 0,第二个元素的索引为 1,以此类推。
实例
从以下数组中获取第一个元素:
import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr[0])
实例
从以下数组中获取第二个元素:
import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr[1])
实例
从以下数组中获取第三和第四个元素并将其相加:
import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr[2] + arr[3])
NumPy 数据类型
Python 中的数据类型
默认情况下,Python 拥有以下数据类型:
strings
- 用于表示文本数据,文本用引号引起来。例如 "ABCD"。integer
- 用于表示整数。例如 -1, -2, -3。float
- 用于表示实数。例如 1.2, 42.42。boolean
- 用于表示 True 或 False。complex
- 用于表示复平面中的数字。例如 1.0 + 2.0j,1.5 + 2.5j。
NumPy 中的数据类型
NumPy 有一些额外的数据类型,并通过一个字符引用数据类型,例如 i
代表整数,u
代表无符号整数等。
以下是 NumPy 中所有数据类型的列表以及用于表示它们的字符。
i
- 整数b
- 布尔u
- 无符号整数f
- 浮点c
- 复合浮点数m
- timedeltaM
- datetimeO
- 对象S
- 字符串U
- unicode 字符串V
- 固定的其他类型的内存块 ( void )
检查数组的数据类型
NumPy 数组对象有一个名为 dtype
的属性,该属性返回数组的数据类型:
实例
获取数组对象的数据类型:
import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr.dtype)
实例
获取包含字符串的数组的数据类型:
import numpy as np
arr = np.array(['apple', 'banana', 'cherry'])
print(arr.dtype)
用已定义的数据类型创建数组
我们使用 array()
函数来创建数组,该函数可以使用可选参数:dtype
,它允许我们定义数组元素的预期数据类型:
实例
用数据类型字符串创建数组:
import numpy as np
arr = np.array([1, 2, 3, 4], dtype='S')
print(arr)
print(arr.dtype)
对于 i
、u
、f
、S
和 U
,我们也可以定义大小。
实例
创建数据类型为 4 字节整数的数组:
import numpy as np
arr = np.array([1, 2, 3, 4], dtype='i4')
print(arr)
print(arr.dtype)
转换已有数组的数据类型
更改现有数组的数据类型的最佳方法,是使用 astype()
方法复制该数组。
astype()
函数创建数组的副本,并允许您将数据类型指定为参数。
数据类型可以使用字符串指定,例如 'f'
表示浮点数,'i'
表示整数等。或者您也可以直接使用数据类型,例如 float
表示浮点数,int
表示整数。
实例
通过使用 'i'
作为参数值,将数据类型从浮点数更改为整数:
import numpy as np
arr = np.array([1.1, 2.1, 3.1])
newarr = arr.astype('i')
print(newarr)
print(newarr.dtype)
NumPy 数组迭代
数组迭代
迭代意味着逐一遍历元素。
当我们在 numpy 中处理多维数组时,可以使用 python 的基本 for 循环来完成此操作。
如果我们对 1-D 数组进行迭代,它将逐一遍历每个元素。
实例
迭代以下一维数组的元素:
import numpy as np
arr = np.array([1, 2, 3])
for x in arr:
print(x)
使用 nditer() 迭代数组
函数 nditer()
是一个辅助函数,从非常基本的迭代到非常高级的迭代都可以使用。它解决了我们在迭代中面临的一些基本问题,让我们通过例子进行介绍。
迭代每个标量元素
在基本的 for
循环中,迭代遍历数组的每个标量,我们需要使用 n 个 for
循环,对于具有高维数的数组可能很难编写。
实例
遍历以下 3-D 数组:
import numpy as np
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
for x in np.nditer(arr):
print(x)
迭代不同数据类型的数组
我们可以使用 op_dtypes
参数,并传递期望的数据类型,以在迭代时更改元素的数据类型。
NumPy 不会就地更改元素的数据类型(元素位于数组中),因此它需要一些其他空间来执行此操作,该额外空间称为 buffer,为了在 nditer()
中启用它,我们传参 flags=['buffered']
。
实例
以字符串形式遍历数组:
import numpy as np
arr = np.array([1, 2, 3])
for x in np.nditer(arr, flags=['buffered'], op_dtypes=['S']):
print(x)
NumPy 数组连接
连接 NumPy 数组
连接意味着将两个或多个数组的内容放在单个数组中。
在 SQL 中,我们基于键来连接表,而在 NumPy 中,我们按轴连接数组。
我们传递了一系列要与轴一起连接到 concatenate()
函数的数组。如果未显式传递轴,则将其视为 0。
实例
连接两个数组:
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.concatenate((arr1, arr2))
print(arr)
实例
沿着行 (axis=1) 连接两个 2-D 数组:
import numpy as np
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
arr = np.concatenate((arr1, arr2), axis=1)
print(arr)
使用堆栈函数连接数组
堆栈与级联相同,唯一的不同是堆栈是沿着新轴完成的。
我们可以沿着第二个轴连接两个一维数组,这将导致它们彼此重叠,即,堆叠(stacking)。
我们传递了一系列要与轴一起连接到 concatenate()
方法的数组。如果未显式传递轴,则将其视为 0。
实例
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.stack((arr1, arr2), axis=1)
print(arr)
沿行堆叠
NumPy 提供了一个辅助函数:hstack()
沿行堆叠。
实例
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.hstack((arr1, arr2))
print(arr)
沿列堆叠
NumPy 提供了一个辅助函数:vstack()
沿列堆叠。
实例
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.vstack((arr1, arr2))
print(arr)
沿高度堆叠(深度)
NumPy 提供了一个辅助函数:dstack()
沿高度堆叠,该高度与深度相同。
实例
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.dstack((arr1, arr2))
print(arr)
NumPy 数组拆分
拆分 NumPy 数组
拆分是连接的反向操作。
连接(Joining)是将多个数组合并为一个,拆分(Spliting)将一个数组拆分为多个。
我们使用 array_split()
分割数组,将要分割的数组和分割数传递给它。
实例
将数组分为 3 部分:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
newarr = np.array_split(arr, 3)
print(newarr)
注释:返回值是一个包含三个数组的数组。
如果数组中的元素少于要求的数量,它将从末尾进行相应调整。
实例
将数组分为 4 部分:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
newarr = np.array_split(arr, 4)
print(newarr)
提示:我们也有 split()
方法可用,但是当源数组中的元素较少用于拆分时,它将不会调整元素,如上例那样,array_split()
正常工作,但 split()
会失败。
拆分为数组
array_split()
方法的返回值是一个包含每个分割的数组。
如果将一个数组拆分为 3 个数组,则可以像使用任何数组元素一样从结果中访问它们:
实例
访问拆分的数组:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
newarr = np.array_split(arr, 3)
print(newarr[0])
print(newarr[1])
print(newarr[2])
NumPy 数组排序
数组排序
排序是指将元素按有序顺序排列。
有序序列是拥有与元素相对应的顺序的任何序列,例如数字或字母、升序或降序。
NumPy ndarray 对象有一个名为 sort()
的函数,该函数将对指定的数组进行排序。
实例
对数组进行排序:
import numpy as np
arr = np.array([3, 2, 0, 1])
print(np.sort(arr))
注释:此方法返回数组的副本,而原始数组保持不变。
您还可以对字符串数组或任何其他数据类型进行排序:
实例
对数组以字母顺序进行排序:
import numpy as np
arr = np.array(['banana', 'cherry', 'apple'])
print(np.sort(arr))
实例
对布尔数组进行排序:
import numpy as np
arr = np.array([True, False, True])
print(np.sort(arr))
NumPy 数组过滤
数组过滤
从现有数组中取出一些元素并从中创建新数组称为过滤(filtering)。
在 NumPy 中,我们使用布尔索引列表来过滤数组。
布尔索引列表是与数组中的索引相对应的布尔值列表。
如果索引处的值为 True
,则该元素包含在过滤后的数组中;如果索引处的值为 False
,则该元素将从过滤后的数组中排除。
实例
用索引 0 和 2、4 上的元素创建一个数组:
import numpy as np
arr = np.array([61, 62, 63, 64, 65])
x = [True, False, True, False, True]
newarr = arr[x]
print(newarr)
上例将返回 [61, 63, 65]
,为什么?
因为新过滤器仅包含过滤器数组有值 True
的值,所以在这种情况下,索引为 0 和 2、4。
创建过滤器数组
在上例中,我们对 True
和 False
值进行了硬编码,但通常的用途是根据条件创建过滤器数组。
实例
创建一个仅返回大于 62 的值的过滤器数组:
import numpy as np
arr = np.array([61, 62, 63, 64, 65])
# 创建一个空列表
filter_arr = []
# 遍历 arr 中的每个元素
for element in arr:
# 如果元素大于 62,则将值设置为 True,否则为 False:
if element > 62:
filter_arr.append(True)
else:
filter_arr.append(False)
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)
实例
创建一个过滤器数组,该数组仅返回原始数组中的偶数元素:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7])
# 创建一个空列表
filter_arr = []
# 遍历 arr 中的每个元素
for element in arr:
# 如果元素可以被 2 整除,则将值设置为 True,否则设置为 False
if element % 2 == 0:
filter_arr.append(True)
else:
filter_arr.append(False)
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)
直接从数组创建过滤器
上例是 NumPy 中非常常见的任务,NumPy 提供了解决该问题的好方法。
我们可以在条件中直接替换数组而不是 iterable 变量,它会如我们期望地那样工作。
实例
创建一个仅返回大于 62 的值的过滤器数组:
import numpy as np
arr = np.array([61, 62, 63, 64, 65])
filter_arr = arr > 62
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)
实例
创建一个过滤器数组,该数组仅返回原始数组中的偶数元素:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7])
filter_arr = arr % 2 == 0
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)