import numpy as np # pip install numpy
# 用于处理高维数据计算的包
特性:同类型的数据
# numpy的计算效率比原生python快很多 --- 数据要达到一定的量级
import random,time
import numpy as np
# 列表 --- 计算求和的执行时间
a = []
for i in range(10000000):
a.append(random.random())
t1 = time.time()
sum1 = sum(a)
t2 = time.time()
# numpy
b = np.array(a) # 转成numpy数组
t3 = time.time()
sum2 = np.sum(b) # 求和
t4 = time.time()
print(t2-t1, t4-t3)
运行结果:
0.11269879341125488 0.015958070755004883
可以看出,大数量级计算用numpy计算会快很多。
创建一维数组
1.列表转数组
# 1. 列表转数组
arr1 = np.array([1,2,3])
print(arr1)
print(type(arr1)) # 打印类型
运行结果
[1 2 3]
<class 'numpy.ndarray'>
2.range()
arr2 = np.array(range(6))
print(arr2)
运行结果
[0 1 2 3 4 5]
3. arange(开始索引,结束索引,步长)
arr3 = np.arange(0,10,3)
print(arr3, type(arr3))
运行结果
[0 3 6 9] <class 'numpy.ndarray'>
4. np.linespace()返回在间隔[开始,结束]上计算的num个均匀间隔的样本
arr4 = np.linspace(2.0,3.0,num=5)
print(arr4)
运行结果
[2. 2.25 2.5 2.75 3. ]
如果把num=5 改成num=11
arr4 = np.linspace(2.0,3.0,num=11)
print(arr4)
运行结果
[2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3. ]
如果把num=5改成num=7
arr4 = np.linspace(2.0,3.0,num=7)
print(arr4)
运行结果
[2. 2.16666667 2.33333333 2.5 2.66666667 2.83333333
3. ]
因为 7 是无法整除的,只能取近似的值
arr4 = np.linspace(20,50,num=2)
print(arr4)
运行结果
[20. 50.]
结果是小数,不会丢失精度。
创建二维数组
lst = [[1,2],[3,4],[5,6]]
arr5 = np.array(lst)
print(arr5)
运行结果
[[1 2]
[3 4]
[5 6]]
lst = [[1,2],[3,4],[5,6]]
arr5 = np.array(lst,dtype=float) # dtype 元素的类型
print(arr5)
运行结果
[[1. 2.]
[3. 4.]
[5. 6.]]
查看数组的类型:
print(arr5.dtype)
运行结果
float64
全0的数组
print(np.zeros((3, 4)))
运行结果
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
全1的数组
print(np.ones((2,3)))
运行结果
[[1. 1. 1.]
[1. 1. 1.]]
数组的运算
arr1 = np.array([[1,2,3],[4,5,6]])
print(arr1)
print("*"*20)
print(arr1+arr1) # 对应位置的元素进行加减乘除
print("*"*20)
print(arr1*arr1)
print("*"*20)
print(1/arr1) # 广播机制
运行结果
[[1 2 3]
[4 5 6]]
********************
[[ 2 4 6]
[ 8 10 12]]
********************
[[ 1 4 9]
[16 25 36]]
********************
[[1. 0.5 0.33333333]
[0.25 0.2 0.16666667]]
索引和切片
ar = np.arange(5,20)
print(ar)
print("*"*30)
# 取8
print(ar[3])
# 取8-10
print(ar[3:6])
# 间隔取
print(ar[3::2])
运行结果
[ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
******************************
8
[ 8 9 10]
[ 8 10 12 14 16 18]
二维数组
ar2 = np.arange(16).reshape(4,4) # reshape重新捏一下形状 reshape里面的两个数相乘一定要等于arange里面的数
print(ar2)
运行结果
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
如果reshape里面参数改成(4,5),会报错
ar2 = np.arange(16).reshape(4,5) # reshape重新捏一下形状 reshape里面的两个数相乘一定要等于arange里面的数
print(ar2)
运行结果
ar2 = np.arange(16).reshape(4,5) # reshape重新捏一下形状 reshape里面的两个数相乘一定要等于arange里面的数
^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: cannot reshape array of size 16 into shape (4,5)
取第一行,下标从0开始
print(ar2[0])
运行结果
[0 1 2 3]
取2
print(ar2[0][2])
print(ar2[0,2]) # 行号 列号 省略方式
运行结果
2
2
取 5 6 9 10
print(ar2[1:3,1:3])
运行结果
[[ 5 6]
[ 9 10]]
布尔型索引
teachers = np.array(['rose','haha','Jack','robot','Tom'])
print(teachers == 'rose') # 凡是判断的结果一定是True 或者 False
运行结果
[ True False False False False]
data = np.random.randn(5,4)
print(data)
运行结果
[[ 1.08893953 -0.70317228 0.55169662 -1.30495173]
[ 0.98154633 -0.72936513 0.33058208 0.57239182]
[-0.40509382 0.15353756 1.73665277 0.00415434]
[ 1.01259648 -1.48156185 1.05480352 -0.06303268]
[-0.23894871 -0.45785407 0.38477254 0.24553404]]
如果把teachers == 'rose'作为条件放到data里面会发生什么?
# 按条件筛选data数据
print(data[teachers == 'rose'])
运行结果
[[ 0.66567526 -0.38454582 0.18877536 -0.46789483]]
只有条件为真的时候才输出,如果条件为假,则不输出数据
data里面有正数,有负数,把小于0的筛选出来
print(data[data<0])
运行结果
[-1.5186963 -0.97091759 -1.30439112 -0.91095577 -0.2362025 -0.27058865
-2.23508056 -0.34103601 -0.74653296 -0.97800185 -1.41998651]
注意:用pycharm每次运行的时候随机数都不同,所以运行结果也是不同的随机数
生活案例小实战
heights = np.array([1.65,1.75,1.80,1.70,1.60])
weights = np.array([65,70,80,75,55])
# BMI
bmi = weights/(heights**2)
print(bmi)
运行结果
[23.87511478 22.85714286 24.69135802 25.95155709 21.484375 ]
统计函数
exam_scores = np.array([85,78,92,88,70,95,80,85,90,78,84,88,92,86,75])
# 平均值和中位数
mean_score = np.mean(exam_scores) # 平均值
median_score = np.median(exam_scores) # 中位数
print(mean_score, median_score)
# 最高分和最低分
print(np.max(exam_scores),np.min(exam_scores))
# 最大值和最小值对应的索引
print(np.argmax(exam_scores), np.argmin(exam_scores))
运行结果
84.4 85.0
95 70
5 4
np.where ()
# 三元表达式:为真的结果 if 条件 else 为假的结果
# np.where() 和 三元表达式的效果是差不多的, 为什么用它,在处理大规模数据的时候np.where()会更加灵活,它处理的效率会更高
arr1 = np.array([1, 8, 10, 22])
arr2 = np.array([22, 44, 66, 17])
cond = np.array([True,False, True,False])
# 三元表达式
res = [(x if c else y) for x, c, y in zip(arr1,cond,arr2)]
print(res)
# np.where(条件,x,y)
print(np.where([True, False, True, False], arr1, arr2))
运行结果
[1, 44, 10, 17]
[ 1 44 10 17]
w = np.array([8,10,22,66])
print(np.where(w > 10)) # 返回符合条件的下标
print(np.where(w > 10, 88, w)) # 如果元素大于10,改为88, 如果不大于10,还用原来的值
运行结果
(array([2, 3], dtype=int64),)
[ 8 10 88 88]