Numpy
今天来简单介绍一下Numpy中常见常用的函数以及方法。
1. 生成数组
- np.arange
栗子:np.arange(min, max, step) max不可取,step为步长,可为小数
import numpy as np a = np.arange(0, 5, 0.5) print(a) 结果为: [0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. 4.5]
- np.linspace
栗子:linspace(min, max, length) max可取,length表示从[min, max]之间的数平均分为几份
c = np.linspace(0, 10, 11) print(c) 结果为: [ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
- range和np.arange的对比:
range是个迭代器,加个np.array或者list可以展示迭代器生成的值
栗子:range(min, max, step) max不可取,步长step只能是整数
所以range和np.arange在生成数组上的区别在于步长是否可为小数,range不可以,而np.arange可以。b = np.array(range(0, 5, 1)) print(b) 结果为: [0 1 2 3 4]
2. 数组和标量之间的运算
a = np.arange(1, 11)
print(a)
print(" ")
print(a + 1) # 数组中每个数都加1
print(" ")
print(a * 3) # 数组中每个数都乘以3
print(" ")
print(a // 3 ) # 数组中每个数都整除3
print(" ")
print(a ** 0.5) # 数组中每个数都开方
print(" ")
print(a > 0.5) # 找出数组中大于0.5的数,大于返回True,反之返回False
结果为:
[ 1 2 3 4 5 6 7 8 9 10]
[ 2 3 4 5 6 7 8 9 10 11]
[ 3 6 9 12 15 18 21 24 27 30]
[0 0 1 1 1 2 2 2 3 3]
[1. 1.41421356 1.73205081 2. 2.23606798 2.44948974 2.64575131 2.82842712 3. 3.16227766]
[ True True True True True True True True True True]
3. 同样大小数组之间的运算
a = np.arange(1, 11)
b = np.arange(10, 20)
print(a + b) # 数组a和数组b中对应的元素相加
print(" ")
print(a > b) # 数组a和数组b中对应的元素相比,返回布尔型,a > b返回True,反之返回False
print(" ")
print(a / b) # 数组a的元素除以数组b中对应的元素
print(" ")
print(a ** b)
print(" ")
print(a % b) # 数组a的元素除余数组b中对应的元素
print(" ")
print(a == b) # 判断数组a的元素是否数组b中对应的元素,返回布尔型
结果为:
[11 13 15 17 19 21 23 25 27 29]
[False False False False False False False False False False]
[0.1 0.18181818 0.25 0.30769231 0.35714286 0.4
0.4375 0.47058824 0.5 0.52631579]
[ 1 2048 531441 67108864 1808548329 2033549312 -1526366847 0 -1953380655 -1981284352]
[ 1 2 3 4 5 6 7 8 9 10]
[False False False False False False False False False False]
4. 数组和列表的区别
看个栗子:
a = np.arange(10)
b = list(range(10))
c = a[0:5]
d = b[0:5]
print(a)
print(b)
print("")
c[0] = 20
d[0] = 20
print(a)
print(b)
结果为:
[0 1 2 3 4 5 6 7 8 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[20 1 2 3 4 5 6 7 8 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
可以发现这里对数组c的第一个值进行幅值,则a中的值也相应改变,这是因为c只是对a的引用,而pandas和数组numpy做数据分析的时候,可能会有很大的数组,占用较大的空间为了,省空间以及时间就直接引用,而d相当于是copy了列表b的一部分,是一个独立的列表,所以对它赋值不会对b造成影响,但如果不想改变a的值并对c赋值,可以使用c = a[0:5].copy()
5. 布尔型索引
怎么不通过遍历快速找到一个数组中大于5的元素呢?这里就可以用到我们的布尔型索引了!
a = np.arange(10)
print(a)
print(a > 5)
print(a[a > 5])
结果为:
[0 1 2 3 4 5 6 7 8 9]
[False False False False False False True True True True]
[6 7 8 9]
对于数组,输入一个元素均为bool型的列表作为索引,可以取出数组中为True的值
再举个例子:
a = np.arange(10)
print(a[[True, False, False, True, True, False, True, False, True, True]])
结果为:
[0 3 4 6 8 9]
那怎么取出a中大于5的偶数呢?
法一: 先取出大于5的数,再从中取出偶数;或者顺序反一下也行
a = np.arange(10)
b = a[a > 5]
c = b[b % 2 == 0]
print(c)
结果为: [6 8]
法二: 按位与&
print(a[(a > 5) & (a % 2 == 0)])
结果为: [6 8]
用括号是因为&的优先级比较高,如果不 用括号,就会出现5先和b相与,就会出现问题
再问,如何取出a中大于5的数或偶数?
可以使用按位或|
print(a[(a > 5) | (a % 2 == 0)])
结果为:[0 2 4 6 7 8 9]
6. 花式索引
如何取出列表中索引为1,3,4,5,8的元素?
a = np.arange(1, 11)
print(a[[1, 3, 4, 5, 8]])
结果为: [2 4 5 6 9]
二维数组的花式索引:
# 取出b中第0行中大于2的数
b = np.arange(20).reshape(4, 5)
print(b[0, b[0] > 2])
结果为: [3 4]
但是,二维数组的花式索引和一位数组不太一样,举个例子:
print(b[[1, 3], [1, 3]])
结果为:[6 18]
,取出的是(1, 1) (3, 3)位置的值!
7. np.array的常用函数
-
开方函数:
np.sqrt
a = np.arange(0, 10, 0.5) print(np.sqrt(a)) # 对数组中的每个值进行开方运算
结果为:
[0. 0.70710678 1. 1.22474487 1.41421356 1.58113883 1.73205081 1.87082869 2. 2.12132034 2.23606798 2.34520788 2.44948974 2.54950976 2.64575131 2.73861279 2.82842712 2.91547595 3.082207 ]
-
取整函数:
ceil、floor、trunc、rint
a = np.arange(0, 10, 0.5) b = 1.5 print(round(b)) # 四舍五入 print(int(b)) # 向0取整 print(np.floor(b)) # 向下取整 print(np.ceil(b)) # 向上取整 print(np.floor(a)) # 向下取整 print(np.ceil(a)) # 向上取整 print(np.trunc(a)) # 向0取整 print(np.rint(a)) # 四舍五入
结果为:
2 1 1.0 2.0 [0. 0. 1. 1. 2. 2. 3. 3. 4. 4. 5. 5. 6. 6. 7. 7. 8. 8. 9. 9.] [ 0. 1. 1. 2. 2. 3. 3. 4. 4. 5. 5. 6. 6. 7. 7. 8. 8. 9. 9. 10.] [0. 0. 1. 1. 2. 2. 3. 3. 4. 4. 5. 5. 6. 6. 7. 7. 8. 8. 9. 9.] [ 0. 0. 1. 2. 2. 2. 3. 4. 4. 4. 5. 6. 6. 6. 7. 8. 8. 8. 9. 10.]
-
把小数和整数分开:
np.modf
x, z = np.modf(a) # 把小数和整数分开 print("小数部分为: ", x) print("整数部分为: ", z)
结果为:
小数部分为: [0. 0.5 0. 0.5 0. 0.5 0. 0.5 0. 0.5 0. 0.5 0. 0.5 0. 0.5 0. 0.5 0. 0.5] 整数部分为: [0. 0. 1. 1. 2. 2. 3. 3. 4. 4. 5. 5. 6. 6. 7. 7. 8. 8. 9. 9.]
-
判断数组里是否有nan:
np.isnan
c = a / a print(np.isnan(c))
结果为:
[ True False False False False False False False False False False False False False False False False False False False]
-
输出两个数组中较大或者较小的一位的数组:
np.maximum、np.minimum
d = np.array([1, 2, 5, 6, 7]) e = np.array([2, 3, 4, 7, 9]) print(np.maximum(d, e)) # 输出两个数组中较大的一位 print(np.minimum(d, e))
结果为:
[2 3 5 7 9] [1 2 4 6 7]
8. np.array的统计方法
a = np.arange(10)
print(a.sum()) # 求和
print(a.mean()) # 求平均值
print(a.std()) # 求标准差
print(a.var()) # 求方差(表示整组数据的离散程度)
# a.mean()+a.std()和a.mean()-a.std()可以估计这组数的范围,60%左右的数据落在这个范围
# a.mean()+2*a.std()和a.mean()-2*a.std() 90%左右的数据落在这个范围
print(a.min()) # 获取最小值
print(a.max()) # 获取最大值
print(a.argmax()) # 获取最大值索引
print(a.argmin()) # 获取最小值索引
结果为:
45
4.5
2.8722813232690143
8.25
0
9
9
0
9. numpy生成随机数
import random
print(random.random()) # 生成0-1的随机数
print(np.random.randint(0, 10)) # np.random.randint(a, b) 生成[a,b]之间的随机数
# np.random.randint(a, b, c) 生成c个[a,b]之间的随机数
# np.random.randint(a, b, (c, d)) 生成c行d列的[a,b]之间的随机数
a = np.random.randint(0, 10, 5)
print(random.choice(a)) # 在a中随机选择一个数
print(np.random.rand(10)) # 随机生成10个0-1的数
print(np.random.choice(a, 10)) # 从a中随机出10个数
print(np.random.uniform(1, 10, 7)) # np.random.uniform出现的每一个小数的概率相同
# np.random.uniform(a, b, c) # 随机生成c个[a, b]的小数
结果为:
0.7374455772920107
9
5
[0.53554948 0.74975394 0.02349303 0.39619196 0.72419649 0.39722265 0.50524038 0.89804028 0.77669783 0.59872178]
[5 4 8 8 5 4 4 4 5 4]
[6.58919545 9.72106818 9.5223332 6.94093535 8.33363967 4.01829591 9.21466905]