首先为啥要学numpy呢?空口无凭,看个小练习
假如有一个列表,里面有n个值,取出列表大于某个数的值
import numpy as np
import random
# 假如取出其中大于60的值
a = [random.randint(1, 100) for i in range(50)]
# print(a)
# 学python第一天
new_list = []
for i in a:
if i > 60:
new_list.append(i)
print(new_list)
# 学了匿名函数后
c = list(filter(lambda x: x > 60, a))
print(c)
# 学了numpy后
d = np.array(a)
print(d[d > 60])
[68, 69, 77, 69, 61, 77, 95, 96, 73, 88, 98, 74, 88, 98, 92, 63]
[68, 69, 77, 69, 61, 77, 95, 96, 73, 88, 98, 74, 88, 98, 92, 63]
[68 69 77 69 61 77 95 96 73 88 98 74 88 98 92 63]
显而易见,使用numpy之后要简单的多!即numpy将许多批量操作变得更简单,更高效!!!
一,安装环境
numpy属于python中的第三方库,需要在Windows的dos窗口或pycharm下面的Terminal中输入如下命令进行安装
pip install numpy
二,创建array
1,导入numpy包
import numpy as np
import random
2,创建array
a = [random.randint(10, 30) for i in range(10)]
b = np.array(a) # 创建数组
print(b)
print(type(a), type(b)
[25 22 28 10 21 12 22 29 20 11]
<class 'list'> <class 'numpy.ndarray'>
a = np.array([1, 2, 3, 4, 5])
print(a)
b = np.array(range(10))
print(b)
[1 2 3 4 5]
[0 1 2 3 4 5 6 7 8 9]
3,创建多维数组
①创建二维数组
a = np.array([[1, 2, 3, 4], [6, 7, 8, 9]])
print(a)
[[1 2 3 4]
[6 7 8 9]]
a = np.arange(5, 20).reshape((3, 5))
print(a)
[[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
②创建三维数组
a = np.array([[[1, 2, 3, 4], [6, 7, 8, 9]], [[2, 4, 5, 6], [3, 4, 5, 6]]])
print(a)
[[[1 2 3 4]
[6 7 8 9]]
[[2 4 5 6]
[3 4 5 6]]]
a = np.arange(5, 17).reshape((2, 3, 2))
print(a)
[[[ 5 6]
[ 7 8]
[ 9 10]]
[[11 12]
[13 14]
[15 16]]]
4,创建全0数组
print(np.array([0] * 10))
a = np.zeros(10) # 默认是float
b = np.zeros(10, dtype=int) # 转换为int
print(a)
print(b)
[0 0 0 0 0 0 0 0 0 0]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0 0 0 0 0 0 0 0 0 0]
5,创建全1数组
print(np.ones(10)) # 默认是小数
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
6,创建空数组
print(np.empty(10)) # 创建空数组,以前内存中留下的值,没有意义
[6.23042070e-307 4.67296746e-307 1.69121096e-306 3.11523921e-307
7.56599128e-307 1.37961913e-306 8.01097889e-307 1.78019082e-306
1.78020984e-306 1.60218627e-306]
7,创建单位矩阵
print(np.eye(5))
[[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.]]
8, 其他一些
①求数组长度
b = np.array(range(20))
print(b.size)
20
②
print(np.linspace(1, 13, 10)) # 将1~13平均分为10份
[ 1. 2.33333333 3.66666667 5. 6.33333333 7.66666667
9. 10.33333333 11.66666667 13. ]
③
print(np.arange(10)) # 和range用法基本类似,唯一的区别是arange第三个参数可以用小数
print(np.arange(1, 10, 0.5))
[0 1 2 3 4 5 6 7 8 9]
[1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5 6. 6.5 7. 7.5 8. 8.5 9. 9.5]
三,array的批量运算
1,
b = [random.randint(0, 100) for n in range(10)]
c = np.array(b)
print(c)
print(c + 1)
print(c / 3)
[72 50 91 95 35 63 66 65 53 15]
[73 51 92 96 36 64 67 66 54 16]
[24. 16.66666667 30.33333333 31.66666667 11.66666667 21.
22. 21.66666667 17.66666667 5. ]
2,
a = np.arange(10)
b = np.arange(5, 15)
print(a, b)
print(a + b)
print(b / a)
print(a > b)
print(a > 5)
print(a**0.5)
[0 1 2 3 4 5 6 7 8 9] [ 5 6 7 8 9 10 11 12 13 14]
[ 5 7 9 11 13 15 17 19 21 23]
G:/untitled/data_habding/numpy_study/day1/study2.py:76: RuntimeWarning: divide by zero encountered in true_divide
print(b / a) # [ inf 6. 3.5 2.66666667 2.25 2.
[ inf 6. 3.5 2.66666667 2.25 2.
1.83333333 1.71428571 1.625 1.55555556] # inf(infinity即无穷) 比任何浮点数都大
[False False False False False False False False False False]
[False False False False False False True True True True]
[0. 1. 1.41421356 1.73205081 2. 2.23606798
2.44948974 2.64575131 2.82842712 3. ]
四,array的索引
1,
a = np.arange(5, 16)
print(a) # [ 5 6 7 8 9 10 11 12 13 14 15]
print(a[0]) # 5
2,
a = np.arange(15).reshape((3, 5)) # 快速创建3行5列的二维数组
print(a)
# [[ 0 1 2 3 4]
# [ 5 6 7 8 9]
# [10 11 12 13 14]]
print(a[0][0]) # 0 列表式写法
print(a[0, 0]) # 0 推荐(新式写法)
print(a[1, 2]) # 7
3,布尔索引
a = np.arange(5)
print(a)
b = a[[True, False, True, False, False]]
print(b) # [0 2]
4,花式索引
a = np.arange(5, 20).reshape((3, 5))
print(a)
# [[ 5 6 7 8 9]
# [10 11 12 13 14]
# [15 16 17 18 19]]
print(a[0, a[0] > 6]) # [7 8 9]
print(a[[0, 2], :][:, [1, 3]])
# [[ 6 8]
# [16 18]]
五,array的切片
1,
a = np.arange(5, 15) # [ 5 6 7 8 9 10 11 12 13 14]
print(a[: 3]) # [5 6 7]
print(a[-5:]) # [10 11 12 13 14]
2,
a = np.arange(5, 20).reshape((3, 5))
# [[ 5 6 7 8 9]
# [10 11 12 13 14]
# [15 16 17 18 19]]
print(a[:, 1]) # [ 6 11 16]
print(a[: 2, 1: 3])
# [[ 6 7]
# [11 12]]
print(a[1:, 3:])
# [[13 14]
# [18 19]]
3,数组和列表的一个小区别
a = list(range(5, 15))
print(a)
b = np.arange(5, 15)
print(b)
c = a[: 5]
d = b[: 5]
c[0] = 20 # [5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
d[0] = 20 # [20 6 7 8 9 10 11 12 13 14]
print(a)
print(b)
总结:数组中修改其切片中的元素,数组中也会被修改,但是列表不会
六,numpy中通用函数
1,abs取绝对值
a = np.arange(-20, 5)
print(np.abs(a))
[20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 2 3
4]
2,sqrt开方
a = np.arange(-20, 5)
print(np.sqrt(a))
[ nan nan nan nan nan nan
nan nan nan nan nan nan
nan nan nan nan nan nan
nan nan 0. 1. 1.41421356 1.73205081
2. ]
注:nan(即not a number)不是一个数 不等于任何浮点数(nan != nan)
3,round
①原python中
import math
print(round(3.4)) # 四舍五入取整 3
print(int(1.9)) # 直接扔掉小数位 1
print(math.floor(1.8)) # 向下取整 1
print(math.floor(-1.8)) # 向下取整 -2
print(math.ceil(1.1)) # 向上取整 2
print(math.ceil(-1.6)) # 向上取整 -1
②numpy中
a = np.arange(-5.5, 5)
print(a)
print(np.round(a)) # [-6. -4. -4. -2. -2. -0. 0. 2. 2. 4. 4.]
print(np.trunc(a)) # [-5. -4. -3. -2. -1. -0. 0. 1. 2. 3. 4.]
print(np.floor(a)) # [-6. -5. -4. -3. -2. -1. 0. 1. 2. 3. 4.]
print(np.ceil(a)) # [-5. -4. -3. -2. -1. -0. 1. 2. 3. 4. 5.]
③
a = np.linspace(1, 5, 10)
print(a)
print(np.round(a, 2)) # 取两位小数
[1. 1.44444444 1.88888889 2.33333333 2.77777778 3.22222222
3.66666667 4.11111111 4.55555556 5. ]
[1. 1.44 1.89 2.33 2.78 3.22 3.67 4.11 4.56 5. ]
4,modf 剥离小数位和整数位
a = np.arange(-5.5, 5.5)
print(a)
print(np.modf(a))
# (array([-0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5]),
# array([-5., -4., -3., -2., -1., -0., 0., 1., 2., 3., 4.]))
5,两个特殊的浮点数
①nan
# nan(nan即not a number)不是一个数 不等于任何浮点数(nan != nan)
print(float('nan')) # nan
a = np.arange(0, 5)
print(a / a) # [nan 1. 1. 1. 1.]
print(np.nan) # 创建nan
print(np.nan == np.nan) # False
如何判断数据里有没有nan
a = np.array([0, 3, 6, 8, 0])
b = a / a
print(np.isnan(b)) # 判断数据里面有没有nan [ True False False False True]
print(b[~np.isnan(b)]) # [1. 1. 1.] 去掉里面的nan
②inf
# inf(infinity即无穷) 比任何浮点数都大
print(float('inf')) # inf
如何判断数据里有没有inf
a = np.array([3, 4, 6, 9]) # [inf 1. inf 4.5] 表示无穷大
b = np.array([0, 4, 0, 2])
c = a / b
print(np.inf == np.inf) # True
print(c[~np.isinf(c)]) # [1. 4.5] 去掉里面的inf
print(c[c!=np.inf]) # [1. 4.5] 去掉里面的inf
6,maximum 返回两个数组中一一对应位置上最大的一个值
a = np.array([3, 5, 6, 8])
b = np.array([5, 8, 2, 1])
print(np.maximum(a, b)) # [5 8 6 8]
7,minimum 返回两个数组中一一对应位置上最小的一个值
a = np.array([3, 5, 6, 8])
b = np.array([5, 8, 2, 1])
print(np.minimum(a, b)) # [3 5 2 1]
七,数学和统计方法
1,sum()求和
a = np.array([3, 5, 6, 8])
print(a.sum()) # 22
2,mean()求平均值
a = np.array([3, 5, 6, 8])
print(a.mean()) # 5.5
3,var()求方差(整组数据的离散程度)
a = np.array([3, 5, 6, 8])
print(a.var()) # 3.25
4,std()求标准差(方差开方)
a = np.array([3, 5, 6, 8])
print(a.std()) # 1.8027756377319946
5,max() min()求最大值,最小值
a = np.array([3, 5, 6, 8])
print(a.max()) # 8
print(a.min()) # 3
6,argmax() argmin() 求最大数下标,最小数下表
a = np.arange(-10, 10)
print(a.argmax()) # 19
print(a.argmin()) # 0
八,随机生成数
1,random库中的用法
print(random.random()) # 返回[0, 1)的随机浮点数
print(random.randint(1, 10)) # 返回[1.10]的随机整数
print(random.choice(list(range(3, 10)))) # 从所给列表中随机选一个元素返回
a = list(range(5, 15))
random.shuffle(a) # 打乱列表
print(a)
print(random.uniform(1, 10)) # [1,10]随机返回一个浮点数
2,numpy中的用法
print(np.random.randint(0, 10)) # 8
print(np.random.randint(0, 10, 10)) # [0 1 5 8 4 7 3 6 8 6]
print(np.random.randint(0, 10, (3, 5)))
# [[2 9 2 3 6]
# [9 2 8 4 1]
# [5 3 1 6 5]]
print(np.random.random(10)) # [0.33031099 0.35918637 0.65868327 0.74442108 0.71771834 0.74782961
# 0.15125635 0.17983218 0.37393755 0.77529924]
print(np.random.random()) # 0.7375970998290451
print(np.random.rand()) # 0.4410851788926652
print(np.random.rand(10)) # [0.14405128 0.0463478 0.97758344 0.03100739 0.94210667 0.70551171
# 0.91935786 0.43250767 0.78710345 0.78756913]
print(np.random.randint(1, 19)) # 16
print(np.random.randint(1, 19, 10)) # [ 7 15 17 12 18 14 13 15 5 16]
print(np.random.choice(np.arange(1, 10))) # 随机选一个
a = np.arange(3, 13)
np.random.shuffle(a) # 随机打乱顺序
print(a)
print(np.random.uniform(1, 10)) # 随机返回一个浮点数
print(np.random.uniform(1, 10, 10)) # 随机返回十个浮点数