简介
Numpy(Numerical Python)是一个在Python领域做数值计算非常重要的库,
Pandas、Matplotlib、Statmodels、Scikit-learn和其它一些科学计算库都依赖Numpy
也就是说有时候你可能没有直接import numpy as np,但是却在背后有用到它
Numpy数组对比Python对象更节省空间、速度更快
- print(sys.getsizeof(1)) # python中一个整数 28
- print(np.dtype(int).itemsize) # Numpy特别小 4
性能也很重要
- start_time = time.time()
- a = np.arange(100000)
- np.sum(a ** 2)
- end_time = time.time()
- print(end_time - start_time) # 0.0014064311981201172
安装
pip install numpy
引入
import numpy as np
一维数组
- a = np.array([1, 2, 3, 4])
- print(a[0]) # 取出单个元素 1
- print(a[[0, -1]]) # 取出多个元素 [1 4]
- print(a[[True, False, False, True]])# 利用布尔取出多个元素 [1 4]
- print(a[1:4]) # 类似列表的切片操作[2 3 4]
多维数组
- a = np.array([[1, 2, 3], [4, 5, 6]])
- print(a.shape) # 形状 (2, 3)
- print(a.ndim) # 行数 2
- print(a.size) # 大小 6
- print(a[1]) # 获取元素 [4 5 6]
- print(a[0:2]) # 切片
查看数据类型
- print(np.array([1, 2, 3, 4]).dtype) # int32
- print(np.array([0, .5, 1, 1.5, 2]).dtype) # float64
- print(np.array(['a', 'b', 'c']).dtype) #
- <U1【表示Unicode】,1代表最大一个字符
- print(np.array(['adwadawd', 'b', 'c']).dtype) #
- <U8【表示Unicode】
- print(np.array([{'name': 'jkw'}, .5, 1, 1.5, 2]).dtype) # object
查看数据类型所占内存大小
- print(np.dtype(np.int8).itemsize) # 1
- print(np.dtype(np.int32).itemsize) # 4
指定数据类型
- np.array([1, 2, 3, 4], dtype=float)
- np.array([1, 2, 3, 4], dtype=np.int8)
-
广播机制
- a = np.arange(4)
- print(a) # [1 2 3 4]
- print(a + 10) # 广播操作 [10 11 12 13]
- print(a * 10) # 广播操作 [ 0 10 20 30]
- b = np.array([10, 10, 10, 10])
- print(a + b) # 对应位置进行计算 [10 11 12 13]
布尔数组的用处
- a = np.array([1, 2, 3, 4])
- print(a[[True, False, False, True]])# 利用布尔取出多个元素 [1 4]
- print(a > 2) # 判断会返回布尔数组【若满足条件只有一个,那么直接会返回元素】 [False False True True]
运算符的使用
- a = np.array([1, 2, 3, 4])
- print(a[~(a > 2)]) # ~ 是not的意思 [1 2]
- print(a[(a == 0) | (a == 1)]) # |是or的意思 [1]
- print(a[(a <= 2) & (a % 2 == 0)]) # &是and的意思 [2]
arange
语法格式为:range([start,] end [,step])
start:表示起始数字【可选,默认是0】
end: 结尾数字
step: 步长【可选,默认是1】
- np.arange(10)
- np.arange(5, 10)
- np.arange(0, 1, .1)
数学函数
- a = np.array([1, 2, 3, 4])
- print(a.mean()) # 求平均值 2.5
- x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
- print(np.sin(x))
- print(np.cos(x))
- print(np.exp(x))
- print(np.log(x))
- print(np.sqrt(x))
随机数
- # 参数可以使单个生成一维数组,也可以是2个,生成二维数组
- print(np.random.random(size=2)) # 【0~1,可以取0】随机浮点数 [0.75730215 0.24639044]
- print(np.random.normal(size=2)) # 标准正态分布取值【均值为0,方差为1】 [-1.39069266 0.25014434]
- print(np.random.randint(50, 100, size=2)) # 在50-100 取值 [ 2 50]
- print(np.random.rand(2, 4)) # 根据均匀分布取值
- '''
- [[0.75064719 0.72179169 0.85748488 0.92259082]
- [0.46155837 0.83502102 0.10128444 0.27298604]]
- '''
改变矩阵形状【扩维】
- print(np.arange(10).reshape(2, 5)) # 改变形状 从一维变二维
- '''[[0 1 2 3 4]
- [5 6 7 8 9]]'''
- print(np.arange(10).reshape((5, 2, 1))) # 改变形状 从一维变三维
改变矩阵形状【缩维】
print(np.arange(10).reshape(2, 5).flatten()) # [0 1 2 3 4 5 6 7 8 9]
linspace
- print(np.linspace(0, 1, 5)) # 0-1之间均匀取五个数 [0. 0.25 0.5 0.75 1. ]
- print(np.linspace(0, 1, 5, False)) # 0-1之间均匀取五个数,不包括末尾数
zeros, ones, empty
- print(np.zeros(5)) # [0. 0. 0. 0. 0.]
- print(np.zeros((3), dtype=np.int8)) # [0 0 0]
- np.zeros((3,3))
- print(np.ones(5)) # [1. 1. 1. 1. 1.]
- print(np.ones((5), dtype=np.int8)) # [1 1 1 1 1]
- np.ones((3,3))
- print(np.empty(5)) # 仅仅开辟空间,里面数据不固定
- np.empty((2,2))
identity, eye
- print(np.identity(3))
- print(np.eye(3, 3))
- '''[[1. 0. 0.]
- [0. 1. 0.]
- [0. 0. 1.]]'''
- np.eye(8,4)
- np.eye(8,4,k=1)
- np.eye(8,4,k=-3)
整合
- a = np.array([
- [1, 2, 3, 7],
- [4, 5, 6, 7],
- [7, 8, 9, 7]
- ])
- b = np.array([
- [10, 20, 30, 40],
- [50, 60, 70, 80],
- [70, 80, 10, 20],
- ])
- c = np.concatenate((a, b)) # 整合
- print(c.shape) # (6, 4)
- c2 = np.stack((a, b)) # 整合,创建一个新的维度
- print(c2.shape) # (2, 3, 4)
切分
- a = np.array([[1, 2, 3, 7],[4, 5, 6, 7],[7, 8, 9, 7],[8, 5, 3, 1]])
- print(np.split(a, 4))
- print(np.split(a, 2))
- print(np.hsplit(a, 4))
- print(np.hsplit(a, 2))
追加, 插入
- b = [10, 20, 30, 40]
- a = np.append(a, b)
- a = np.append(a, [b]) # 需要有同样的维度
- a = np.append(a, [b], axis=0) # 还需要选择维度
- a = np.insert(a, 1, b, axis=0) # 另一种做法