Numpy

0

Numpy介绍

  NumPy是Python的一种开源的数值计算扩展,这种工具可用来存储和处理大型矩阵,专为进行严格的数字处理而产生。

Numpy特点

  NumPy提供了一个N维数组类型ndarray,它描述了相同类型的的集合。
  numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算。
  Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,效率远高于纯Python代码。

Numpy应用

Numpy创建数组

array方法

1
2
3
4
import numpy as np

# np.array(list) 将list转换为数组类型
a = np.array([[1, 2, 3], [4, 5, 6]])

1

zeros,ones,eye方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np

# np.zeros(shape, dtype=None) 生成形状为shape的全0数组(默认为float64)
a = np.zeros((2,3))

# np.ones(shape, dtype=None) 生成形状为shape的全1数组(默认为float64)
b = np.ones((2,3))

# np.zeros_like(array, dtype=None) 生成形状与array相同的全0数组(默认为float64)
c = np.zeros_like(b)

# np.ones_like(array, dtype=None) 生成形状与array相同的全1数组(默认为float64)
d = np.ones_like(a)

# np.eye(m, n, k=0) 生成m行n列的单位矩阵,n默认等于m,k为上下的偏移量,默认为0(默认为float64)
e = np.eye(3, 4, 1)

3

arange方法

1
2
3
4
import numpy as np

# np.arange(start, stop, step, dtype=None) 生成start到stop,步长为step的数组
a = np.arange(10, 20, 2)

4

linspace,logspace方法

1
2
3
4
5
6
7
8
import numpy as np

# np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 将start到stop等分成num个点,endpoint=True代表包括stop
a = np.linspace(10, 20, 6)

# np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None) 将start到stop等分成num个点,每一个点i的值为base的i次幂
b = np.logspace(1, 2, 10)

5

random方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np

# np.random.seed(n) 设定随机种子,以备后面的结果可以复现
np.random.seed(1)

# np.random.randint(low, high, shape=None) 产生形状为shape的分布区间为[low, high)的随机整数
a = np.random.randint(0, 10, (3, 3))

# np.random.rand(shape=None) 产生形状为shape的[0-1)均匀随机数
b = np.random.rand(3,3)

# np.random.uniform(low=0.0, high=1.0, shape=None) 产生形状为shape的分布区间为[low, high)的均匀随机数
c = np.random.uniform(0, 10, (3, 3))

# np.random.randn(shape=None) 产生形状为shape的均值为0,方差为1的高斯随机数
d = np.random.rand(3,3)

# np.random.normal(loc=0.0, scale=1.0, shape=None) 产生形状为shape的均值为loc,标准差为scale的高斯随机数
e = np.random.normal(5, 5, (3,3))

6

Numpy属性

ndim,shape,size,dtype属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])

# obj.ndim 查看对象的维度
a.ndim

# obj.shape 查看对象的形状
a.shape

# obj.size 查看对象的元素个数
a.size

# obj.dtype 查看对象的类型(整数默认为int32,浮点数默认为float64)
a.dtype

2

Numpy切片与索引

:(冒号)方法

1
2
3
4
5
6
import numpy as np

a = np.arange(12).reshape((3, 4))

# obj[start:stop:step, ...],指在某一维度上,从start开始,到stop结束,不包括stop,间隔为step,start省略为从第一个元素开始,stop省略为到最后一个元素结束,step省略为间隔为1
b = a[1:, 0:4:2]

8

方法

1
2
3
4
5
6
import numpy as np

a = np.arange(12).reshape((3, 4))

# obj[[x1, x2, ...], ...],指在某一维度上,取出x1,x2,...所在位置的元素
b = a[[[1, 1], [2, 2]], [[0, 2], [0, 2]]]

9

nonzero方法

1
2
3
4
5
6
7
8
import numpy as np

a = np.random.randint(0, 3, (3, 3))

# np.nonzero(obj) 返回obj中非0的索引
b = a > 1
c = np.nonzero(a)
d = np.nonzero(b)

34

方法

1
2
3
4
5
6
import numpy as np

a = np.arange(12).reshape((3, 4))

# obj1[obj1 op obj2] 返回obj1对obj2操作后值为True的值,并用一维数组保存
b = a[a > 5]

26

ix_方法

1
2
3
4
5
6
7
8
9
import numpy as np

a = np.arange(12).reshape((3, 4))

# obj[np.ix_(array1, array2, ...)] 按照array1,array2,...的顺序取出元素
b = a[np.ix_([1, 2], [0, 2])]

# 与列表操作对比
c = a[[1, 2], [0, 2]]

10

split方法

1
2
3
4
5
6
7
import numpy as np

a = np.arange(12).reshape((2, 6))

# np.split(obj, indices, axis=0) 将obj按照axis的方向(0代表横向,1代表纵向)切分。indices为整数指平均切分成indices份,为列表指按照列表进行切分。
b = np.split(a, 3, axis=1)
c = np.split(a, [1, 3], axis=1)

11

Numpy插入,连接与删除

append方法

1
2
3
4
5
6
7
8
import numpy as np

a = np.arange(9).reshape((3, 3))

# np.append(obj, array, axis=None) axis=None时,将obj展开为一维数组,然后再与array连接,axis=0,在纵向连接在下方,axis=1,在横向连接在右方
b = np.append(a, [[9], [10], [11]])
c = np.append(a, [[9,10,11]], axis=0)
d = np.append(a, [[9], [10], [11]], axis=1)

12

insert方法

1
2
3
4
5
6
7
8
import numpy as np

a = np.arange(9).reshape((3, 3))

# np.insert(obj, index, array, axis=None) axis的用法同append一样,多了index项,可以插入到任意位置,且位数不相同时可以进行广播操作
b = np.insert(a, 2, 9)
c = np.insert(a, 2, 9, axis=0)
d = np.insert(a, 2, 9, axis=1)

13

concatenate方法

1
2
3
4
5
6
7
8
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

# np.concatenate((obj1, obj2, ...), axis=0) 在axis轴上连接两个数组,默认为axis=0
c = np.concatenate((a, b))
d = np.concatenate((a, b), axis=1)

15

stack方法

1
2
3
4
5
6
7
8
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

# np.stack((obj1, obj2, ...), axis=0) 在axis维度上新建一个轴,并在此轴上连接数组,默认为axis=0
c = np.stack((a, b))
d = np.stack((a, b), axis=1)

16

delete方法

1
2
3
4
5
6
7
8
import numpy as np

a = np.arange(9).reshape((3, 3))

# np.delete(obj, index, axis=None) axis的用法同append一样,多了index项,可以删除任意位置的元素
b = np.delete(a, 1)
c = np.delete(a, 1, axis=0)
d = np.delete(a, 1, axis=1)

14

Numpy广播与复制

broadcast_to方法

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

a = np.array([[1, 2, 3]])
b = np.array([[1], [2], [3]])
c = np.array([1])

# np.broadcast_to(obj, shape) 将obj广播至shape形状
# 原理是如果obj的维度数小于shape,则在对应维度位置上补1,扩展成相同维度,然后将所有的1维度复制i次,i为shape中相应的维度
d = np.broadcast_to(a, (3, 3)) # a的维度为(1, 3),维度与(3, 3)数量相同,则将1复制3次,变成(3, 3)
e = np.broadcast_to(b, (3, 3)) # b的维度为(3, 1),维度与(3, 3)数量相同,则将1复制3次,变成(3, 3)
f = np.broadcast_to(c, (3, 3)) # c的维度为(1),维度与(3, 3)数量不相同,则在对应维度位置上补1,扩展成相同维度,变成(1, 1),然后将1复制3次,变成(3, 3)

17

tile方法

1
2
3
4
5
6
import numpy as np

a=np.array([[1, 2], [3, 4]])

# np.tile(obj, (m, n, ...)) 将obj的维度复制(m, n, ...)次
b = np.tile(a, (2, 3))

18

Numpy改变数组形状

reshape方法

1
2
3
4
5
6
import numpy as np

a=np.array([[1, 2, 3], [4, 5, 6]])

# obj.reshape(shape) 将obj的形状改变为shape
b = a.reshape((3, 2))

7

resize方法

1
2
3
4
5
6
7
import numpy as np

a = np.arange(9).reshape(3, 3)

# np.resize(obj, shape) 将obj的大小调整为shape,先按顺序读取,少则从头补入数据,多则删除多余数据
b = np.resize(a, (2, 2))
c = np.resize(a, (4, 4))

19

T(transpose)方法

1
2
3
4
5
6
import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])

# obj.T 将obj转置,等价于np.transpose(obj)
b = a.T

20

swapaxes方法

1
2
3
4
5
6
import numpy as np

a = np.arange(8).reshape(2, 2, 2)

# np.swapaxes(obj, axis1, axis2) 交换obj的两个轴
b = np.swapaxes(a, 0, 2)

21

expand_dims方法

1
2
3
4
5
6
7
import numpy as np

a = np.array([1, 2, 3])

# np.expand_dims(obj, axis) 在指定axis插入一个新的轴
b = np.expand_dims(a, 0)
c = np.expand_dims(a, 1)

22

squeeze方法

1
2
3
4
5
6
7
8
import numpy as np

a = np.array([[1, 2, 3]])
b = np.array([[1], [2], [3]])

# np.squeeze(obj, axis) 在指定axis删除轴,如果该轴的大小不为1,则无法删除报错
c = np.squeeze(a, 0)
d = np.squeeze(b, 1)

23

ravel,flatten方法

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np

a = np.arange(9).reshape(3, 3)
b = np.arange(9).reshape(3, 3)

# obj.ravel(order='C') 将obj展平为一位数组,且修改按行展平后的数据,原数据受到改变。order='C'(按行展平元素),'F' (按列展平元素),'A' (按原顺序展平元素),'K'(按内存中的出现顺序展平元素)
c = a.ravel()
d = a.ravel('F')
c[1] += 1

# obj.flatten(order='C') 将obj展平为一位数组,且修改按行展平后的数据,原数据不受到改变。order用法同ravel
e = b.flatten()
e[1] += 1

24

Numpy数学运算

运算符方法

1
2
3
4
5
6
7
8
9
10
import numpy as np

a = np.arange(2, 10, 2).reshape(2, 2)
b = np.arange(1, 5).reshape(2, 2)

# 算术运算(+,-,*,/,//,%,**,>,>=,<,<=,==,!=,&,|,^,~,>>,<<)要求两个数组具有同样的形状或者可广播为同样形状,逻辑运算返回值为True或者False
c = a + b
d = a - b
e = a * b
f = a / b

25

特殊值,对数函数,三角函数方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np

# 特殊值(π,e,∞,Nan)
a = np.pi / 2
b = np.e
c = np.inf
d = np.nan

# np.log(obj),np.log2(obj),np.log10(obj) 对obj求以e为底,2为底,10为底的对数
e = np.log([b, 2, 10])
f = np.log2([b, 2, 10])
g = np.log10([b, 2, 10])

# np.sin(obj),np.arcsin(obj) 对obj求sin值和arcsin值,所用的为弧度值
h = np.sin(a)
i = np.arcsin(h)

27

around,floor,ceil方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np

a = np.array([3.33, 5.55, 88.88])

# np.around(obj, decimals=0) 四舍五入操作,decimals大于0,四舍五入到小数点右侧,小于0,四舍五入到小数点左侧
b = np.around(a)
c = np.around(a, 1)
d = np.around(a, -1)

# np.floor(obj) 向下取整
e = np.floor(a)

# np.ceil(obj) 向上取整
f = np.ceil(a)

28

sum,cumsum,cumprod方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np

a = np.random.randint(0, 5, (3, 3))

# np.sum(obj, axis=None) 将obj元素累加,axis=None代表全局,axis=0代表每列,axis=1代表每行
b = np.sum(a)

# np.cumsum(obj, axis=None) 将obj逐项累加,axis用法同np.sum
c = np.cumsum(a)
d = np.cumsum(a, 0)

# np.cumprod(obj, axis=None) 将obj逐项累乘,axis用法同np.sum
e = np.cumprod(a)
f = np.cumprod(a, 1)

32

ptp方法

1
2
3
4
5
6
7
8
import numpy as np

a = np.random.randint(0, 5, (3, 3))

# np.ptp(obj, axis=None) 计算axis轴上最大值减最小值的结果,axis用法同np.sum
b = np.ptp(a)
c = np.ptp(a, 0)
d = np.ptp(a, 1)

33

diff方法

1
2
3
4
5
6
7
8
import numpy as np

a = np.random.randint(0, 10, (5, 5))

# np.diff(obj, n, axis) 计算n阶差分运算,axis默认为最后一个维度
b = np.diff(a, 1)
c = np.diff(a, 2)
d = np.diff(a, 1, 0)

36

clip方法

1
2
3
4
5
6
import numpy as np

a = np.random.randint(0, 10, (5, 5))

# np.clip(obj, min_, max_) 将obj中小于min_的值赋值为min_,将obj中大于max_的值赋值为max_
b = np.clip(a, 3, 7)

37

Numpy数理统计

unique方法

1
2
3
4
5
6
import numpy as np

a = np.random.randint(0, 10, (5, 5))

# np.unique(obj, return_index, return_inverse, return_counts) 统计得到不重复元素,如果不是一维数组,会将数组展开。return_index=True返回不重复元素在原数组中第一次出现的索引,return_inverse=返回原数组在不重复元素中的索引, return_counts=返回每个不重复元素在原数组中出现的次数
b, index, inverse, counts = np.unique(a, True, True, True)

29

any,all方法

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

a = np.random.randint(0, 10, (5, 5))

# np.any(obj) 判断obj中是否存在True
b = np.any(a > 5)
c = np.any(a > 10)

# np.all(obj) 判断obj中是否全都是True
d = np.all(a >= 0)
e = np.all(a > 5)

35

统计方法

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
import numpy as np

a = np.random.randint(0, 10, (5, 5))

# np.amax(obj, axis=None),np.amin(obj, axis=None) 统计最大最小值,axis用法同np.sum
np.amax(a)
np.amax(a,0)
np.amax(a,1)

# np.argmax(obj, axis=None),np.argmin(obj, axis=None) 统计最大最小值的索引,axis用法同np.sum
np.argmax(a)
np.argmax(a,0)
np.argmax(a,1)

# np.mean(obj, axis=None) 统计中位数,axis用法同np.sum
np.median(a)

# np.mean(obj, axis=None) 统计均值,axis用法同np.sum
np.mean(a)

# np.mean(obj, axis=None, weights=None) 统计加权平均值,axis用法同np.sum
np.average(a, None, a)

# np.mean(obj, axis=None) 统计标准差,axis用法同np.sum
np.std(a)

# np.mean(obj, axis=None) 统计方差,axis用法同np.sum
np.var(a)

30

sort,argsort方法

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

a = np.random.randint(0, 5, (3, 3))

# np.sort(obj, axis, kind='quicksort', order=None) 对obj进行从小到达排序,axis为指定要排序的轴,axis=0按列排序,axis=1按行排序。kind为排序算法,可以选择'quicksort'(快速排序,默认),'mergesort'(归并排序),'heapsort'(堆排序),order为要排序的字段,一般数学运算不用
b = np.sort(a, 0)
c = np.sort(a, 1)

# np.argsort(obj, axis, kind='quicksort', order=None) 返回排序后的数组在原数组的索引,用法同sort
d = np.argsort(a, 0)
e = np.argsort(a, 1)

31

Numpy线性代数

dot,matmul方法

1
2
3
4
5
6
7
8
import numpy as np

a = np.arange(6).reshape(2, 3)
b = np.arange(6).reshape(3, 2)

# np.dot(obj1, obj2) 等价于np.matmul(obj1, obj2),矩阵乘法
c = np.dot(a, b)
d = np.matmul(a, b)

38

det,eig,pinv方法

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np

a = np.array([[-2, 1, 1], [0, 2, 0], [-4, 1, 3]])

# np.linalg.det(obj) 计算obj的行列式
b = np.linalg.det(a)

# np.linalg.eig(obj) 计算obj的特征值和特征向量
c = np.linalg.eig(a)

# np.linalg.pinv(obj) 计算obj的伪逆矩阵
d = np.linalg.pinv(a)

39

solve方法

1
2
3
4
5
6
7
import numpy as np

a = np.array([[2, 2, -1], [1, -2, 4], [5, 8, -1]])
b = np.array([[6], [3], [27]])

# np.linalg.solve(A, b) 求线性方程组Ax = b的解
c = np.linalg.solve(a, b)

31

Numpy数据保存

save,load方法

1
2
3
4
5
6
7
8
9
import numpy as np

a = np.arange(12).reshape(3, 4)

# np.save(filename, obj) 将obj保存在文件名为filename的.npy文件中(可以不加.npy扩展名)
np.save('save1', a)

# np.load(filename) 读取文件名为filename的数组数据(要加.npy扩展名)
b = np.load('save1.npy')

41

savez方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np

a = np.arange(12).reshape(3, 4)
b = np.arange(6).reshape(2, 3)

# np.savez(filename, name1=obj1, name2=obj2, ...) 将多个数据保存在文件名为filename的.npz文件中(可以不加.npz扩展名),obj1的变量名为name1,obj2的变量名为name2,……(变量的默认名称为arr_0,arr_1,……)
np.savez('save2', no_1=a, no_2=b)
np.savez('save3', a, b)

# np.load(filename) 读取文件名为filename的数组数据(要加.npz扩展名)
c = np.load('save2.npz')
d = np.load('save3.npz')

# 提取数据时要使用数组的名称
e = c['no_1']
f = c['no_2']
g = d['arr_0']
h = d['arr_1']

42

savetxt,loadtxt方法

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np

a = np.arange(12).reshape(3, 4)
b = np.array([1,2,3,4])
c = np.array([5,6,7,8])

# np.savetxt(filename, obj, fmt='%f', delimiter=' ') 将多个一维数据(相同大小)或者一个二维维数据保存在文件名为filename的.txt文件中(要加.txt扩展名),格式为fmt(默认为浮点型),分隔符为delimiter(默认为' '),保存时会将多个一维数组转化成一个二维数组
np.savetxt('save4.txt', a)
np.savetxt('save5.txt', (b, c))

# np.loadtxt(filename, dtype='float', delimiter=' ') 读取文件名为filename的数组数据(要加.txt扩展名),类型为dtypefloat(默认为浮点型),分隔符为delimiter(默认为' ')
d = np.loadtxt('save4.txt')
e = np.loadtxt('save5.txt')

43

Numpy小结

  由于numpy支持各种矩阵运算,且运算效率非常高,因此numpy库广泛应用于数据分析,机器学习,深度学习等各个领域,其作为机器学习三剑客之一,也受到广大使用者的喜爱。

-------------本文结束感谢您的阅读-------------
0%