NumPy是一个开源的Python科学计算基础库,包含:
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合C/C++/Fortran代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
NumPy的引用:
import numpy as np
ndarray是一个多维数组对象,由两部分构成:
- 实际的数据
- 描述这些数据的元数据(数据维度、数据类型等)
ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始
属性 | 说明 |
---|---|
.ndim | 维度的数量 |
.shape | ndarray对象的尺度,对于矩阵,n行m列 |
.size | ndarray对象元素的个数,相当于.shape中n*m的值 |
.dtype | ndarray对象的元素类型 |
.itemsize | ndarray对象中每个元素的大小,以字节为单位 |
例如:
>>> a=np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
>>> a.ndim
2
>>> a.shape
(3, 4)
>>> a.size
12
>>> a.dtype
dtype('int64')
>>> a.itemsize
8
数据类型 | 说明 |
---|---|
bool | 布尔类型,True或False |
intc | 与C语言中的int类型一致,一般是int32或int64 |
intp | 用于索引的整数,与C语言中ssize_t一致,int32或int64 int8 字节长度的整数,取值:[‐128, 127] |
int16 | 16位长度的整数,取值:[‐32768, 32767] |
int32 | 32位长度的整数,取值:[‐231, 231‐1] |
int64 | 64位长度的整数,取值:[‐263, 263‐1] |
uint8 | 8位无符号整数,取值:[0, 255] |
uint16 | 16位无符号整数,取值:[0, 65535] |
uint32 | 32位无符号整数,取值:[0, 2^32‐1] |
uint64 | 64位无符号整数,取值:[0, 2^64‐1] |
float16 | 16位半精度浮点数:1位符号位,5位指数,10位尾数 |
float32 | 32位半精度浮点数:1位符号位,8位指数,23位尾数 |
float64 | 64位半精度浮点数:1位符号位,11位指数,52位尾数 |
complex64 | 复数类型,实部和虚部都是32位浮点数 |
complex128 | 复数类型,实部和虚部都是64位浮点数 |
x = np.array(list/tuple)
x = np.array(list/tuple, dtype=np.float32)
//当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型
例如:
>>> a=np.array([0,1,2,3])
>>> a
array([0, 1, 2, 3])
>>> a=np.array([0,1,2,3],dtype=np.float32)
>>> a
array([ 0., 1., 2., 3.], dtype=float32)
>>> print(a)
[ 0. 1. 2. 3.]
函数 | 说明 |
---|---|
np.arange(n) | 类似range()函数,返回ndarray类型,元素从0到n‐1 |
np.ones(shape) | 根据shape生成一个全1数组,shape是元组类型 |
np.zeros(shape) | 根据shape生成一个全0数组,shape是元组类型 |
np.full(shape,val) | 根据shape生成一个数组,每个元素值都是val |
np.eye(n) | 创建一个正方的n*n单位矩阵,对角线为1,其余为0 |
np.ones_like(a) | 根据数组a的形状生成一个全1数组 |
np.zeros_like(a) | 根据数组a的形状生成一个全0数组 |
np.full_like(a,val) | 根据数组a的形状生成一个数组,每个元素值都是val |
np.linspace() | 根据起止数据等间距地填充数据,形成数组 |
np.concatenate() | 将两个或多个数组合并成一个新的数组 |
例如:
>>> np.arange(9)
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
>>> np.ones(9)
array([ 1., 1., 1., 1., 1., 1., 1., 1., 1.])
>>> np.ones((9),dtype=np.int32)
array([1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int32)
>>> np.zeros((2,3))
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> np.full(9,100)
array([100, 100, 100, 100, 100, 100, 100, 100, 100])
>>> np.eye(5)
array([[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 1.]])
>>> x=np.eye(5)
>>> np.full_like(x,8.88)
array([[ 8.88, 8.88, 8.88, 8.88, 8.88],
[ 8.88, 8.88, 8.88, 8.88, 8.88],
[ 8.88, 8.88, 8.88, 8.88, 8.88],
[ 8.88, 8.88, 8.88, 8.88, 8.88],
[ 8.88, 8.88, 8.88, 8.88, 8.88]])
>>> a=np.linspace(1,9,4,dtype=np.int32)
>>> print(a)
[1 3 6 9]
>>> b=np.linspace(1,9,4,endpoint=False,dtype=np.int32)
>>> print(b)
[1 3 5 7]
>>> c=np.concatenate((a,b))
>>> print(c)
[1 3 6 9 1 3 5 7]
方法 | 说明 |
---|---|
.reshape(shape) | 不改变数组元素,返回一个shape形状的数组,原数组不变 |
.resize(shape) | 与.reshape()功能一致,但会修改原数组 |
.astype(new_type) | 创建新的数组 |
.swapaxes(ax1,ax2) | 将数组n个维度中两个维度进行调换 |
.flatten() | 对数组进行降维,返回折叠后的一维数组,原数组不变 |
.tolist() | 数组向列表转换 |
例如:
>>> a=np.arange(24)
>>> print(a)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
>>> a.reshape((4,6))
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
>>> a.resize((4,6))
>>> a
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>> a.swapaxes(0,1)
array([[ 0, 6, 12, 18],
[ 1, 7, 13, 19],
[ 2, 8, 14, 20],
[ 3, 9, 15, 21],
[ 4, 10, 16, 22],
[ 5, 11, 17, 23]])
>>> a.flatten()
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
>>> a.astype(np.float)
array([[ 0., 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10., 11.],
[ 12., 13., 14., 15., 16., 17.],
[ 18., 19., 20., 21., 22., 23.]])
>>> a.tolist()
[[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23]]
直接索引,每个维度一个索引值
>>> a=np.arange(9)
>>> a[3]
3
>>> a[1:8:3]
array([1, 4, 7])
//a[起始编号:终止编号:步长]
>>> a.resize((3,3))
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> a[1,1]
4
切片:获取数组元素子集的过程
>>> a=np.arange(24).reshape((2,3,4))
>>> a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>> a[:,0,-2]
array([ 2, 14])
>>> a[:,0:2,:]
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[12, 13, 14, 15],
[16, 17, 18, 19]]])
>>> a[:,:,::3]
array([[[ 0, 3],
[ 4, 7],
[ 8, 11]],
[[12, 15],
[16, 19],
[20, 23]]])
数组与标量之间的运算作用于数组的每一个元素
>>> a=np.arange(24).reshape((2,3,4))
>>> a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>> a+1
array([[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]],
[[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]]])
>>> a=a*2
>>> a
array([[[ 0, 2, 4, 6],
[ 8, 10, 12, 14],
[16, 18, 20, 22]],
[[24, 26, 28, 30],
[32, 34, 36, 38],
[40, 42, 44, 46]]])
函数 | 说明 |
---|---|
np.abs(x) np.fabs(x) | 计算数组各元素的绝对值 |
np.sqrt(x) | 计算数组各元素的平方根 |
np.square(x) | 计算数组各元素的平方 |
np.log(x) np.log10(x) np.log2(x) | 计算数组各元素的自然对数、10底对数和2底对数 |
np.ceil(x) np.floor(x) | 计算数组各元素的ceiling值 或 floor值 |
np.rint(x) | 计算数组各元素的四舍五入值 |
np.modf(x) | 将数组各元素的小数和整数部分以两个独立数组形式返回 |
np.cos(x) np.cosh(x) np.sin(x) np.sinh(x) np.tan(x) np.tanh(x) | 计算数组各元素的普通型和双曲型三角函数 |
np.exp(x) | 计算数组各元素的指数值 |
np.sign(x) | 计算数组各元素的符号值,1(+), 0, ‐1(‐) |
函数 | 说明 |
---|---|
|
两个数组各元素进行对应运算 |
np.maximum(x,y) np.fmax() np.minimum(x,y) np.fmin() | 元素级的最大值/最小值计算 |
np.mod(x,y) | 元素级的模运算 |
np.copysign(x,y) | 将数组y中各元素值的符号赋值给数组x对应元素 |
< >= <= == != |
算术比较,产生布尔型数组 |
>>> a=np.arange(24).reshape((2,3,4))
>>> b=np.sqrt(a)
>>> a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>> b
array([[[ 0. , 1. , 1.41421356, 1.73205081],
[ 2. , 2.23606798, 2.44948974, 2.64575131],
[ 2.82842712, 3. , 3.16227766, 3.31662479]],
[[ 3.46410162, 3.60555128, 3.74165739, 3.87298335],
[ 4. , 4.12310563, 4.24264069, 4.35889894],
[ 4.47213595, 4.58257569, 4.69041576, 4.79583152]]])
>>> np.minimum(a,b)
array([[[ 0. , 1. , 1.41421356, 1.73205081],
[ 2. , 2.23606798, 2.44948974, 2.64575131],
[ 2.82842712, 3. , 3.16227766, 3.31662479]],
[[ 3.46410162, 3.60555128, 3.74165739, 3.87298335],
[ 4. , 4.12310563, 4.24264069, 4.35889894],
[ 4.47213595, 4.58257569, 4.69041576, 4.79583152]]])
>>> a>b
array([[[False, False, True, True],
[ True, True, True, True],
[ True, True, True, True]],
[[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True]]], dtype=bool)
NumPy的random子库
np.random.*
函数 | 说明 |
---|---|
rand(d0,d1,..,dn) | 根据d0‐dn创建随机数数组,浮点数,[0,1),均匀分布 |
randn(d0,d1,..,dn) | 根据d0‐dn创建随机数数组,标准正态分布 |
randint(low[,high,shape]) | 根据shape创建随机整数或整数数组,范围是[low, high) |
seed(s) | 随机数种子,s是给定的种子值 |
shuffle(a) | 根据数组a的第1轴进行随排列,改变数组x |
permutation(a) | 根据数组a的第1轴产生一个新的乱序数组,不改变数组x |
choice(a[,size,replace,p]) | 从一维数组a中以概率p抽取元素,形成size形状新数组 replace表示是否可以重用元素,默认为False |
uniform(low,high,size) | 产生具有均匀分布的数组,low起始值,high结束值,size形状 |
normal(loc,scale,size) | 产生具有正态分布的数组,loc均值,scale标准差,size形状 |
poisson(lam,size) | 产生具有泊松分布的数组,lam随机事件发生率,size形状 |
>>> np.random.rand(2,3)
array([[ 0.71434594, 0.57272119, 0.47711135],
[ 0.80828704, 0.06779339, 0.36447176]])
>>> np.random.randn(2,3)
array([[ 0.31938179, -1.34453592, -1.35738183],
[-1.93856717, 1.15491882, 0.24352126]])
>>> a=np.random.randint(90,100,(3,4))
>>> a
array([[96, 97, 96, 90],
[97, 90, 99, 98],
[92, 97, 91, 98]])
>>> np.random.shuffle(a)
>>> a
array([[96, 97, 96, 90],
[97, 90, 99, 98],
[92, 97, 91, 98]])
>>> np.random.shuffle(a)
>>> a
array([[96, 97, 96, 90],
[92, 97, 91, 98],
[97, 90, 99, 98]])
函数 | 说明 |
---|---|
sum(a, axis=None) | 根据给定轴axis计算数组a相关元素之和,axis整数或元组 |
mean(a, axis=None) | 根据给定轴axis计算数组a相关元素的期望,axis整数或元组 |
average(a,axis=None,weights=None) | 根据给定轴axis计算数组a相关元素的加权平均值 |
std(a, axis=None) | 根据给定轴axis计算数组a相关元素的标准差 |
var(a, axis=None) | 根据给定轴axis计算数组a相关元素的方差 |
>>> a=np.arange(24).reshape(3,8)
>>> a
array([[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 12, 13, 14, 15],
[16, 17, 18, 19, 20, 21, 22, 23]])
>>> np.min(a)
0
>>> np.argmax(a)
23
>>> np.ptp(a)
23
>>> np.median(a)
11.5
np.gradient(f):计算数组f中元素的梯度,当f为多维时,返回每个维度梯度
梯度:连续值之间的变化率,即斜率
>>> a=np.random.randint(0,20,(5))
>>> a
array([10, 2, 4, 15, 3])
>>> np.gradient(a)
array([ -8. , -3. , 6.5, -0.5, -12. ])
// -8=(2-10)/1
// -3=(4-10)/2
np.savetxt(frame, array, fmt='%.18e', delimiter=None)
np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
>>> a=np.arange(100).reshape(5,20)
>>> np.savetxt('a.scv',a,fmt='%d',delimiter=',')
>>> b=np.loadtxt('a.scv',dtype=np.int,delimiter=',')
>>> b
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19],
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
37, 38, 39],
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59],
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
77, 78, 79],
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
97, 98, 99]])
CSV只能有效存储一维和二维数组
np.savetxt() np.loadtxt()只能有效存取一维和二维数组
a.tofile(frame, sep='', format='%s')
np.fromfile(frame, dtype=float, count=‐1, sep='')
>>> a=np.arange(100).reshape(5,4,5)
>>> a.tofile("b.dat",sep=",",format="%d")
>>> b=np.fromfile("b.dat",sep=",")
>>> b
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,
11., 12., 13., 14., 15., 16., 17., 18., 19., 20., 21.,
22., 23., 24., 25., 26., 27., 28., 29., 30., 31., 32.,
33., 34., 35., 36., 37., 38., 39., 40., 41., 42., 43.,
44., 45., 46., 47., 48., 49., 50., 51., 52., 53., 54.,
55., 56., 57., 58., 59., 60., 61., 62., 63., 64., 65.,
66., 67., 68., 69., 70., 71., 72., 73., 74., 75., 76.,
77., 78., 79., 80., 81., 82., 83., 84., 85., 86., 87.,
88., 89., 90., 91., 92., 93., 94., 95., 96., 97., 98.,
99.])
np.save(fname, array) np.savez(fname, array)
np.load(fname)
>>> a=np.arange(10)
>>> np.save("a.npy",a)
>>> b=np.load("a.npy")
>>> b
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])