Python NumPy 基础
🍦 NumPy是用于处理数组的Python库,具有在线性代数、傅里叶变换等领域工作的功能,由Travis Oliphant于2005年创建。
1 NumPy
- Numpy
- 通过import关键字将其导入应用程序,通常以np别名替代。
- 检查NumPy版本,版本字符串存储在
__version__
属性下。
1 |
|
2 创建数组
- 创建数组
- NumPy中的数组对象称为ndarray,使用数组对象的
array()
函数创建NumPy对象。 type()
用于显示数组类型numpy.ndarray,数组中的维度是一级数组深度(嵌套数组)。- 0-D数组:零维数组,又叫标量,数组中的每个值都是一个0-D数组。
- 1-D数组:一维数组,以零维数组作为元素的数组,是最基本的数组。
- 2-D数组:二维数组,以一维数组作为元素的数组,用于表示二阶张量。
- 3-D数组:三维数组,以二维数组作为元素的数组,用于表示三阶张量。
- 高维数组:数组可有任意数量的维度,创建时使用ndmin参数定义维数。
- 二阶张量又叫矩阵,使用ndim检查数组的维数,返回整数的属性。
- NumPy中的数组对象称为ndarray,使用数组对象的
1 |
|
2-1 数组索引
- 数组索引
- 数组索引与访问数组元素相同,通过引用索引号访问数组元素。
- 索引从0开始,第一个元素索引为0,第二个元素索引为1,以此类推。
- 二维数组和三维数组都使用逗号分隔的整数来表示元素的维度和索引。
- 二维数组索引可以想象为具有行和列的表,行表示维度,索引表示列。
- 可以使用负索引从末尾访问数组。
1 |
|
2-2 数组切片
- 数组切片
- 格式:
[start: end]
或[start: end: step]
,结果包括开始索引,但不包括结束索引。 - start默认为0,end在维度中考虑数组的长度,step默认为1,使用负号可从末尾引用索引。
- 格式:
1 |
|
2-3 数据类型
- 数据类型
- Python中的数据类型:
float、integer、boolean、complex、strings
。 - NumPy模块也有一些额外的数据类型,且是指代具有一个字符的数据类型。
- b(布尔值)、c(复数)、f(浮点数)、i(整数)、m(分钟时间增量,时间差异)、u(无符号整数)。
- M(日期时间)、O(对象)、S(字符串)、U(Unicode字符串)、V(其他类型的固定内存块void)。
- NumPy数组对象有个dtype属性,用于返回数组的数据类型。
array()
创建具有已定义数据类型的数组,带可选参数dtype,允许定义数组元素的预期数据类型。
- Python中的数据类型:
1 |
|
2-4 类型转换
- 类型转换
- 若给定类型无法转换元素,NumPy将引发ValueError(传递给函数的参数类型意外或不正确时显示)。
- 使用
astype()
方法制作数组的副本,允许将数据类型指定为参数,可以更改现有数组的数据类型。 - 用字符串指定数据类型,如
f
(浮点数)、i
(整数)等,或直接使用数据类型,如float
、int
等。
1 |
|
3 副本视图
- 副本视图
- 副本是一个新数组,而视图只是原始数组的视图。
- 副本拥有数据,对副本所做的更改不会影响原始数组,对原始数组所做的更改不会影响副本。
- 视图没有数据,对视图所做的更改将会影响原始数组,对原始数组所做的更改也会影响视图。
- 每个NumPy数组都有base属性,如果数组拥有数据,那么返回None,否则base属性引用原始对象。
- 副本是一个新数组,而视图只是原始数组的视图。
1 |
|
4 形状重塑
- 形状
- 数组形状是每个维度中元素的数量,NumPy数组有shape属性。
- shape属性返回一个元组,每个索引都有与之对应元素的数量。
- 形状元组:每个索引处的整数都表示相应维度具有的元素数量。
1 |
|
- 重塑
- 数组重塑意味着改变数组形状,可添加或删除维度,或更改每个维度元素的数量。
- 只要数组重塑所需要的元素在两种形状中都相同,就可以将数组重塑成任何形状。
- 不必为reshape方法的其中一个维度指定确切的数字,拥有未知维度,作为-1值传递。
- 扁平化数组意味着将多维数组转换为一维数组,可以使用
reshape(-1)
来做到这一点。 - 改变数组形状还有flatten、revel函数,rot90、flip、fliplr和flipud等则可重新排列元素。
1 |
|
5 连接拆分
- 连接
- SQL中基于键连接表,NumPy中通过轴连接数组。
- 通过
concatenate()
函数将数组与轴一起进行传递连接,参数axis默认为0。 - 使用堆栈函数
stack()
连接数组(堆叠,一个轴在另一个轴上),参数axis默认0。 hstack()
(沿行堆叠)、vstack()
(沿列堆叠)、dstack()
(沿高度或深度堆叠)。
1 |
|
- 拆分
- 拆分是连接的逆操作,
array_split()
方法用于拆分数组。- 如果数组的元素少于所需要的元素,那么将相应地从末尾进行自动调整。
- 也可以使用
split()
方法,但若元素较少,不会自动调整,将返回错误。
array_split()
方法的返回值是一个数组,其中包含每个数组拆分为一个数组。- 若将一个数组拆分为3个数组,可以像访问任何数组元素一样从结果中进行访问。
- 可指定要围绕哪个轴进行拆分,使用axis参数进行拆分,或使用
hsplit()
替代。 vstack()
和dstack()
函数对应沿列拆分vsplit()
以及沿高度拆分dsplit()
。
- 拆分是连接的逆操作,
1 |
|
6 数组迭代
- 数组迭代
- 迭代意味着一个一个地遍历元素,在NumPy中处理多维数组时,使用for循环可以进行迭代。
- 若迭代一个n-D数组,将遍历n-1维,要返回实际值,即标量,必须在每个维度中迭代数组。
1 |
|
- 迭代方法
nditer()
是一个帮助函数,可以解决迭代中的一些基本问题。- 使用op_dtypes参数并将预期的数据类型传递给它,可以在迭代时更改元素的数据类型。
- 元素在数组中时,NumPy不会就地更改元素的数据类型,需要一些其他空间来执行此操作。
- 其他空间即缓冲区,为启用额外空间,还需要使用
nditer()
函数的flags=["buffered"]
。
- 使用过滤可以以不同的步长进行迭代,若需元素的相应索引,可用
ndenumerate()
进行枚举迭代。
1 |
|
7 数组搜索
- 数组搜索
where()
方法可以进行数组搜索。searchsorted()
方法:考虑先插入,再排序,最后索引。- 数组中执行二进制搜索,并返回将插入指定值的索引以保持搜索顺序。
- 默认情况下返回左侧索引,使用
side="right"
可以改为返回右侧索引。 - 如果需要搜索多个值,那么可以使用具有指定值的数组进行数组的搜索。
1 |
|
8 数组排序
- 数组排序
- NumPy的ndarray对象有一个
sort()
函数,可以对指定的数组进行排序。 sort()
函数可以对字符串数组、布尔数组或任何其他数据类型进行排序。- 若对二维数组使用
sort()
函数,那么二维数组中的两个数组都将被排序。
- NumPy的ndarray对象有一个
1 |
|
9 数组过滤器
- 数组过滤器
- 从现有数组中取出一些元素,并从中创建一个新数组,称为数组过滤。
- 布尔索引列表过滤数组
- 如果索引处的值是True,则该元素包含在过滤后的数组中。
- 如果索引处的值是False,则该元素从过滤后的数组中排除。
- 根据条件创建过滤器数组,可以在条件中直接替换数组而不是可迭代变量。
1 |
|
Python NumPy 基础
https://stitch-top.github.io/2021/03/01/python/python04-python-numpy-ji-chu/