本文共 5893 字,大约阅读时间需要 19 分钟。
今天来简单介绍一下Numpy中常见常用的函数以及方法。
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]
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(min, max, step) max不可取,步长step只能是整数栗子:
b = np.array(range(0, 5, 1))print(b)结果为:[0 1 2 3 4]所以range和np.arange在生成数组上的区别在于步长是否可为小数,range不可以,而np.arange可以。
a = np.arange(1, 11)print(a)print(" ")print(a + 1) # 数组中每个数都加1print(" ")print(a * 3) # 数组中每个数都乘以3print(" ")print(a // 3 ) # 数组中每个数都整除3print(" ")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]
a = np.arange(1, 11)b = np.arange(10, 20)print(a + b) # 数组a和数组b中对应的元素相加print(" ")print(a > b) # 数组a和数组b中对应的元素相比,返回布尔型,a > b返回True,反之返回Falseprint(" ")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]
看个栗子:
a = np.arange(10)b = list(range(10))c = a[0:5]d = b[0:5]print(a)print(b)print("")c[0] = 20d[0] = 20print(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的元素呢?这里就可以用到我们的布尔型索引了!
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]
|
print(a[(a > 5) | (a % 2 == 0)])
结果为:[0 2 4 6 7 8 9]
如何取出列表中索引为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)位置的值!
开方函数: 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.5print(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)) # 四舍五入
结果为:
211.02.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 / aprint(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]
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()) # 获取最小值索引
结果为:
454.52.87228132326901438.250990
import randomprint(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.737445577292010795[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]
转载地址:http://vfiwi.baihongyu.com/