Python Package:NumPy
NumPy is a library for the Python programming language, adding support for large, multi-dimensional arrays and matrices, along with a large collection of high-level mathematical functions to operate on these arrays.
多维数组 ndarray
NumPy
主要由多维数组 ndarray
(一个用来储存同一种数据类型的有序容器), 和用来操纵 ndarry
的函数组成. ndarray
是 NumPy
核心概念
ndarray
中的元素的可以是整数, 浮点数, 固定长度的字符串, 等等, 还可以是任何 Python
对象的 reference
(并不储存对象本身) 这些元素称为标量 scalar
ndarrays
是同质的:即其所有元素在内存中占据了同样的大小,每一个元素的数据类型对象dtype是一样的
ndarray
中的元素可以用整数(位置)来索引,这和 list
很像, 但 ndarray
可以是多维的 (有多个轴 axis
)
一个 ndarray
在计算机内存中由两个部分组成:
组成了
ndarray
的scalar
ndarray
的头文件, 定义了数组中scalar
唯一的数据类型
数据类型
ndarray
中的元素的可以是整数,浮点数,字符串,等等,还可以是任何 Python
对象的 reference
(并不储存对象本身)。与数组对应,这些元素统称为标量 scalar
以下是这些标量的数据类型对象之间的继承关系:
对象类型 np.object_
object_
: 任何Python
对象的reference
,而非对象本身。但是在使用时会返回这个对象本身
数字类型 np.number
bool_
: 布尔型数据类型(True 或者 False)int_
: 默认的整数类型(类似于 C 语言中的long
,int32
或int64
)intc
: 与 C 的int
类型一样,一般是int32
或int64
intp
: 用于索引的整数类型(类似于 C 的ssize_t
,一般情况下仍然是int32
或int64
)int8
: 字节(-128 to 127)int16
: 整数(-32768 to 32767)int32
: 整数(-2147483648 to 2147483647)int64
: 整数(-9223372036854775808 to 9223372036854775807)uint8
: 无符号整数(0 to 255)uint16
: 无符号整数(0 to 65535)uint32
: 无符号整数(0 to 4294967295)uint64
: 无符号整数(0 to 18446744073709551615)float_
:float64
类型的简写float16
: 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位float32
: 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位float64
: 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位complex_
:complex128
类型的简写,即 128 位复数complex64
: 复数,表示双 32 位浮点数(实数部分和虚数部分)complex128
: 复数,表示双 64 位浮点数(实数部分和虚数部分)
字符类型 np.character
str_
: 字符串unicode_
:unicode
字符串,默认是UTF8
,支持中文
它们的方法和属性与 Python
原生的 str
一致
有些标量的数据类型对象 dtype
与 Python
中的基本数据类型对象 int
, float
, str
, bool
概念上是一样的,两者也可以很容易地互相转换和比较数值大小,但是他们是不同的对象
索引与切片
numpy
保留了 Python
中索引与切片的操作,并且可以针对多维数组
索引会返回一个 scalar
,切片会返回一个 ndarray
多维索引
不同维度之间用“,”隔开。
更新 ndarray
只需对该 ndarray
做索引,并对结果“赋值”。可以使用一个 scalar
更新,也可以使用另一个 ndarray
更新,但需要注意 shape
和 dtype
是否匹配
索引进阶
整数数组索引
使用一个整数数组(list
, tuple
或 ndarray
)来切割
条件索引
使用逻辑表达式来筛选数组中的元素
1 | import numpy as np |
一些条件筛选函数
np.argmax()
,np.argmin()
: 返回沿给定轴最大和最小元素的索引np.nonzero()
: 返回输入数组中非零元素的索引np.where()
: 返回输入数组中满足给定条件的元素的索引np.extract()
: 根据某个条件从数组中抽取元素,返回满条件的元素
数组的维度与轴 Axis
ndarray
的维度 ndim
即指明了其轴的数量。0 轴定义为“最里面”的那个一维数组。
改变 ndarray
的形状
通过 .reshape()
方法可以改变数组的形状。
加轴
np.newaxis
: 在使用这句话的位置增加一条轴
1 | import numpy as np |
广播
当运算中的 2 个数组的形状不同时,numpy
将自动触发广播机制
广播的规则:
输出数组的形状是输入数组形状的各个维度上的最大值
输入数组的每个轴和输出数组的对应轴的长度相同, 或者该轴长度为 1
输入数组若维度低于输出数组,那么在该数组的形状前加1直至补齐
输入数组若某轴的长度为1,则沿着此轴运算时都用此轴上的第一组值
随机数
np.random.rand(d0, d1, d2)
: 从uniform
分布中抽出形状为(d0, d1, d2)
的样本数组,形状为空则返回标量np.random.randn(d0, d1, d2)
: 从标准正态分布中抽出形状为(d0, d1, d2)
的样本数组,形状为空则返回标量np.random.RandomState()
: 固定随机状态允许我们复现某一次随机过程的结果。实例化一个RandomState
对象, 此后我们可以用这个对象替代np.random
来调用np.random
下的函数, 比如np.random.rand
常用方法
np.unique()
: 不重复元素np.sort()
: 排序np.argsort()
: 按照元素值的大小将索引排序np.bincount()
: 自然数数组中各元素的频次.T
: 转置np.linalg.inv()
: 求逆矩阵,np.linalg.pinv()
是求伪逆