Python学习笔记:NumPy
什么是NumPy?
NumPy is the fundamental package for scientific computing with Python. It contains among other things:
- a powerful N-dimensional array object
- sophisticated (broadcasting) functions
- tools for integrating C/C++ and Fortran code
- useful linear algebra, Fourier transform, and random number capabilities
以上是NumPy官网给的定义,翻译如下:
NumPy是用Python进行科学计算的基础包,它包含一下内容:
- 一个强大的N维数组对象Array
- 复杂而精确的函数库
- 集成了C/C++和Fortran代码的工具
- 有用的线性代数、傅立叶变换和随机数生成函数
简而言之,numpy模块为Python提供了N维数组运算的支持,它可以支持高维度的数组和矩阵运算并且提供了大量的数学函数库。
创建数组
Function | Description |
---|---|
np.array | 把 list, tuple, array, 或者其他的序列模式的数据转换为 ndarray, 默认创建一个新的ndarray,可以推断出dtype,也可以显式指定dtype |
np.asarray | 把其他类型的数据转换成为ndarray, 如果是ndarray 输入则默认不进行 copy, 而如果是其他类型数据则创建新的ndarray |
np.arange | 类似于内置的range 函数, 创建一个序列,但返回的是ndarray,而不是列表 |
np.ones,np.ones_like | 根据指定的形状和dtype创建一个全1数组,ones_like以另一个数组为参考,并根据其形状和dtype创建一个全1数组 |
np.zeros,np.zeros_like | 类似于np.ones |
np.empty,np.empty_like | 创建空数组, 类似于np.ones,只分配内存空间但不填充任何值 |
eye | 创建对角线为1其余为0的矩阵 |
identity | 创建对角线为1其余为0的方阵 |
代码示例:
>>> import numpy as np
>>> d = [2, 4, 3, 1, 6, 6]
>>> a = np.array(d)
>>> a
array([2, 4, 3, 1, 6, 6])
>>> type(a)
<type 'numpy.ndarray'>
>>> d2 = [[2, 4], [3, 1], [6, 6]]
>>> a2 = np.array(d2)
>>> a2
array([[2, 4],
[3, 1],
[6, 6]])
>>> a3 = np.asarray(a2)
>>> a3 is a2
True
>>> d1 = d
>>> d1
[2, 4, 3, 1, 6, 6]
>>> a4 = np.asarray(d1)
>>> a4
array([2, 4, 3, 1, 6, 6])
>>> a4 is d1
False
>>> np.ones(2)
array([ 1., 1.])
>>> np.ones((2,3))
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
>>> np.ones_like(a3)
array([[1, 1],
[1, 1],
[1, 1]])
>>> np.ones_like(a2)
array([[1, 1],
[1, 1],
[1, 1]])
>>> np.eye(2)
array([[ 1., 0.],
[ 0., 1.]])
>>> np.eye(2,3)
array([[ 1., 0., 0.],
[ 0., 1., 0.]])
>>> np.identity(3)
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
属性
Attributes | Description |
---|---|
np.size | ndarray 的属性, ndarray 的元素的数量. |
np.dtype | ndarray 的属性, ndarray 的元素的类型, 和 C/C++ 中的类型有对应关系. |
np.itemsize | ndarray 的属性, 元素的字节数, 例如一个 dtype 为 float64 的 ndarray 的元素的大小为 8. |
np.ndim | ndarray 的属性, ndarray 的维度数. |
np.shape | ndarray 的属性, 为包含 ndarray 每个维度的大小的 tuple. |
数组变换
- np.reshape: 返回一个新的按照给定的维度改变的 ndarray
- np.resize: 在原位修改 ndarray 的维度
- np.ravel: 把ndarray变为一维的数组,格式、元素数量不变
- np.squeeze: 返回一个把长度为 1 的维度去掉的 ndarray
>>> x = np.array([[[0], [1], [2]]])
>>> x.shape
(1, 3, 1)
>>> x.squeeze()
array([0, 1, 2])
>>> x.squeeze().shape
(3,)
运算
- np.nonzero(a)/a.nonzero(): 返回一个tuple,包含所有不为0的元素的索引
>>> a
array([[ 4, 0, 6],
[ 2, 12, 12]])
>>> a.nonzero()
(array([0, 0, 1, 1, 1]), array([0, 2, 0, 1, 2])) # 返回了五个indices,没有返回(0, 1)的索引
- x.repeat()
>>> x = np.array([[1,2],[3,4]])
>>> x.repeat(2) # 按元素重复
array([1, 1, 2, 2, 3, 3, 4, 4])
>>> x.repeat(2,axis=0) # 按行重复
array([[1, 2],
[1, 2],
[3, 4],
[3, 4]])
>>> x.repeat(2,axis=1) # 按列重复
array([[1, 1, 2, 2],
[3, 3, 4, 4]])
- np.compress: 按照给定的bool list来选取ndarray中的值, 返回一个新的 ndarray
>>> a
array([[6, 2, 4, 5, 5, 3],
[6, 9, 5, 1, 3, 5]])
>>> a.compress([True, True, False, False, True])
array([6, 2, 5])
>>> a
array([[6, 2, 4, 5, 5, 3],
[6, 9, 5, 1, 3, 5]])
>>> a.compress([True, True, False, False, True], axis=1)
array([[6, 2, 5],
[6, 9, 3]])
>>> a.compress([True, True, False, False, True], axis=0) # 因为没有五行,所以会错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: index 4 is out of bounds for size 2
>>> a.compress([True, False], axis=0)
array([[6, 2, 4, 5, 5, 3]])
>>> a.compress([False, True], axis=0)
array([[6, 9, 5, 1, 3, 5]])
- np.argsort(b)/b.argsort(): 返回元素排序所对应的序号
- np.sort(b)/b.sort(): 在原位排序
>>> b
array([[ 6, 2, 4, 5, 5, 3],
[ 1, 3, 10, 5, 6, 9]])
>>> b.argsort()
array([[1, 5, 2, 3, 4, 0],
[0, 1, 3, 4, 5, 2]])
>>> np.sort(b)
array([[ 2, 3, 4, 5, 5, 6],
[ 1, 3, 5, 6, 9, 10]])
单目运算函数
np.max: 返回最大值
np.argmax: 返回最大的值的序号
np.min: 返回最小值
np.argmin: 返回最小的值的序号
np.absolute: 计算绝对值,np.absolute(a) 或者 np.abs(a),对于非复数的数组,np.fabs 速度更快
np.exp: 计算 e 的指数
np.sqrt: 计算平方根
np.square: 计算平方
np.log, np.log10, np.log2, np.log1p: 分别为以 e, 10, 2 为底取 log, 和 log(1 + x)
np.sign: 取数值的正负号
np.ceil: 计算比每一个元素大或相等的最小的整数
np.floor: 计算比每一个元素小或相等的最大的整数
np.rint: 近似到最近的整数
np.clip(a, a_min, a_max, out=None): 返回一个 ndarray, 其元素的值如果小于min,就会被min值替代;如果大于max,就会被max值替代
np.modf: 返回一个 tuple, 包含两个数组, 一个是小数部分, 一个是整数部分
np.cos, np.cosh, np.sin, np.sinh, np.tan, np.tanh, np.arccos, np.arccosh, np.arcsin, np.arcsinh, np.arctan, np.arctanh: 三角函数和反三角函数
>>> c
array([ 6, 2, 4, 5, 5, 3, 1, 3, 100, 5, 6, 9])
>>> c.clip(2, 10)
array([ 6, 2, 4, 5, 5, 3, 2, 3, 10, 5, 6, 9])
>>> c
array([ 6, 2, 4, 5, 5, 3, 1, 3, 100, 5, 6, 9])
>>> c.clip([3,4,1,1,1,4,4,4,4,4,10,10], 8)
array([ 6, 4, 4, 5, 5, 4, 4, 4, 8, 5, 10, 10])
双目运算函数
np.add(a, b): 两个数组元素一一对应相加.
np.substract(a, b): 两个数组元素一一对应相减.
np.multiply(a, b): 两个数组元素一一对应相乘.
np.devide(a, b): 两个数组元素一一对应相除.
np.maximum, np.fmax: 一一比较两个数组中元素大小, 返回相应位置最大的. np.fmax 会忽略 np.NAN, 而 np.maximum 则返回 np.NAN.
np.minimum, np.fmin: 一一比较两个数组中元素大小, 返回相应位置最小的. np.fmin 会忽略 np.NAN, 而 np.minimum 则返回 np.NAN.
集合运算
np.unique: 返回所有不重复的元素排序后的数组
np.intersect1d: 返回两个数组交集后排序的数组
np.union1d: 返回两个数组并集后排序的数组
np.in1d: 返回一个布尔值数组, 判断一个数组元素是否在另一个数组中
np.setdiff1d: 返回一个数组, 其中包含在第一个输入数组而不在第二个输入数组的元素
np.setxor1d 返回不同时在两个输入数组的元素的数组
统计方法
用于布尔数组的统计方法:
sum : 统计数组/数组某一维度中的True的个数
any: 统计数组/数组某一维度中是否存在一个/多个True
all:统计数组/数组某一维度中是否都是True
普通的统计方法:
np.sum: 计算数组的和, 可以设置参数 axis 为 0 或者 1 单独计算每行或每列的和
np.mean: 计算数组的均值, 可以设置参数 axis 为 0 或者 1 单独计算每行或每列的均值
np.std: 计算数组的标准差, 可以设置参数 axis 为 0 或者 1 单独计算每行或每列的标准差
np.var: 计算数组的标准差, 可以设置参数 axis 为 0 或者 1 单独计算每行或每列的标准差
np.min, np.max: 计算数组的最小值或最大值, 可以设置参数 axis 为 0 或者 1 单独计算每行或每列的最小值或最大值
np.argmin, np.argmax: 计算数组的最小值或最大值的 index, 可以设置参数 axis 为 0 或者 1 单独计算每行或每列的最小值或最大值 index
np.cumsum: 累加
np.cumprod: 累乘
参考至: