Python【Numpy简单介绍】

Numpy

    今天来简单介绍一下Numpy中常见常用的函数以及方法。

1. 生成数组

  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]
    
  2. 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.]
    
  3. range和np.arange的对比:
      range是个迭代器,加个np.array或者list可以展示迭代器生成的值
    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可以。

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的常用函数

  1. 开方函数: 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  ]
    
  2. 取整函数: 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.]
    
  3. 把小数和整数分开: 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.]
    
  4. 判断数组里是否有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]
    
  5. 输出两个数组中较大或者较小的一位的数组: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))  # 随机生成100-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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值