数据据统计基础之numpy学习

20 阅读13分钟

作为python一个重要的扩展库,NumPy从一开始就以处理数据为核心,将多种语言的优势集中在一体,通过学习NumPy,我们可以更好的使用python处理复杂的数据,为人工智能的学习打下坚实的基础。

一、ndarray的使用

1.ndarray的特性

多维性

ndarray 可以表示任意维度的数组:一维(向量)、二维(矩阵)、三维及以上(张量)。

import numpy as np
arr = np.array(5) #创建0维的ndarray数组
print(arr) 
print('arr的维度:',arr.ndim) #数组的维度number of dimensions

运行结果如下:

    5
    arr的维度: 0
arr = np.array([1,2,3]) #创建1维的ndarray数组
print(arr) 
print('arr的维度:',arr.ndim) #数组的维度number of dimensions

运行结果如下:

    [1 2 3]
    arr的维度: 1
arr = np.array([[1,2,3],[4,5,6]]) #创建2维的ndarray数组
print(arr) 
print('arr的维度:',arr.ndim) #数组的维度number of dimensions

运行结果如下:

    [[1 2 3]
     [4 5 6]]
    arr的维度: 2

同质性

ndarray中所有元素必须是相同的数据类型(dtype),如 int32、float64、bool 等。 这保证了内存布局的连续性和计算效率。

arr = np.array([1,'hello']) #不同的数据类型会被强制转换为相同的数据类型
print(arr)

运行结果如下:

    ['1' 'hello']
arr = np.array([1,2.5]) #不同的数据类型会被强制转换为相同的数据类型
print(arr)

运行结果如下:

    [1.  2.5]

2.ndarray的属性

arr = np.array(1)
print(arr)
print('数组的形状:',arr.shape)
print('数组的维度:',arr.ndim)
print('数组的元素的个数:',arr.size)
print('元素的数据类型:',arr.dtype)
print('元素的转置:',arr.T)
print('单个元素的内存占用:',arr.itemsize)
print('总站占用的内存空间:',arr.nbytes)
print('是否连续存储:',arr.flags)

运行结果如下:

    1
    数组的形状: ()
    数组的维度: 0
    数组的元素的个数: 1
    元素的数据类型: int64
    元素的转置: 1
    单个元素的内存占用: 8
    总站占用的内存空间: 8
    是否连续存储:   C_CONTIGUOUS : True
      F_CONTIGUOUS : True
      OWNDATA : True
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False
arr = np.array([1,2.5,3])
print(arr)
print('数组的形状:',arr.shape)
print('数组的维度:',arr.ndim)
print('数组的元素的个数:',arr.size)
print('元素的数据类型:',arr.dtype)
print('元素的转置:',arr.T)
print('单个元素的内存占用:',arr.itemsize)
print('总站占用的内存空间:',arr.nbytes)
print('是否连续存储:',arr.flags)

运行结果如下:

    [1.  2.5 3. ]
    数组的形状: (3,)
    数组的维度: 1
    数组的元素的个数: 3
    元素的数据类型: float64
    元素的转置: [1.  2.5 3. ]
    单个元素的内存占用: 8
    总站占用的内存空间: 24
    是否连续存储:   C_CONTIGUOUS : True
      F_CONTIGUOUS : True
      OWNDATA : True
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False
arr = np.array([[1,2,3],[4,5,6]])
print(arr)
print('数组的形状:',arr.shape)
print('数组的维度:',arr.ndim)
print('数组的元素的个数:',arr.size)
print('元素的数据类型:',arr.dtype)
print('元素的转置:\n',arr.T)
print('单个元素的内存占用:',arr.itemsize)
print('总站占用的内存空间:',arr.nbytes)
print('是否连续存储:',arr.flags)

运行结果如下:

    [[1 2 3]
     [4 5 6]]
    数组的形状: (2, 3)
    数组的维度: 2
    数组的元素的个数: 6
    元素的数据类型: int64
    元素的转置:
     [[1 4]
     [2 5]
     [3 6]]
    单个元素的内存占用: 8
    总站占用的内存空间: 48
    是否连续存储:   C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True
      WRITEABLE : True
      ALIGNED : True
      WRITEBACKIFCOPY : False

3.ndarray的创建

# 基础的创建方法
list1=[4,5,6]
arr = np.array(list1,dtype=np.float64)
print(arr.ndim)  #属性
print(arr)

运行结果如下:

    1
    [4. 5. 6.]
#copy
arr1=np.copy(arr) # 元素跟原始的数组相同,但是不是一个数组
print(arr1) 
arr1[0]=8
print(arr1)
print(arr)

运行结果如下:

    [4. 5. 6.]
    [8. 5. 6.]
    [4. 5. 6.]
# 预定义的形状
#全0 全1 未初始化 固定值
arr= np.zeros((2,3),dtype=int)
print(arr)
print(arr.dtype)

运行结果如下:

    [[0 0 0]
     [0 0 0]]
    int64
arr= np.zeros((200,),dtype=int)
print(arr)

运行结果如下:

    [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 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 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 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 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 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 0 0 0 0 0
     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
#全1
arr= np.ones((5,8),dtype=int)
print(arr)

运行结果如下:

    [[1 1 1 1 1 1 1 1]
     [1 1 1 1 1 1 1 1]
     [1 1 1 1 1 1 1 1]
     [1 1 1 1 1 1 1 1]
     [1 1 1 1 1 1 1 1]]
# 未初始化
arr= np.empty((4,5))
print(arr)

运行结果如下:

    [[4.47593816e-091 4.67350283e+257 9.27777147e+242 3.59363012e+246
      5.98189051e-154]
     [3.15474899e+180 1.27966031e-152 1.33856864e-152 1.32971161e-152
      2.31276869e-152]
     [9.29433783e+242 2.31634000e-152 2.44012173e-154 7.13119939e+252
      1.27990068e-152]
     [4.83245960e+276 6.12501442e+257 2.42766850e-154 5.37266662e+005
      6.01346953e-154]]
arr= np.full((3,4),2025)
print(arr)

运行结果如下:

    [[2025 2025 2025 2025]
     [2025 2025 2025 2025]
     [2025 2025 2025 2025]]
arr1= np.zeros_like(arr)
print(arr1)
arr1= np.empty_like(arr)
print(arr1)
arr1= np.ones_like(arr)
print(arr1)
arr1= np.full_like(arr,2026)
print(arr1)

运行结果如下:

    [[0 0 0 0]
     [0 0 0 0]
     [0 0 0 0]]
    [[      2222002171112                  64                   0
                        0]
     [  27303467877924864 3617858582444585571 3689065128682206310
      3474635106050072880]
     [3703757910348751201 3617908038241236581 7147837364112536632
      7005402423849738800]]
    [[1 1 1 1]
     [1 1 1 1]
     [1 1 1 1]]
    [[2026 2026 2026 2026]
     [2026 2026 2026 2026]
     [2026 2026 2026 2026]]
# 等差数列 2 4 6 8 10
arr =np.arange(1,51,1) # start end step(步长)
print(arr)

运行结果如下:

    [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24     25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48     49 50]
# 等间隔数列 
arr=np.linspace(0,10,3)
print(arr)

运行结果如下:

    [ 0.  5. 10.]
arr=np.linspace(0,100,5,dtype=int)
print(arr)
arr =np.arange(0,101,25)
print(arr)

运行结果如下:

    [  0  25  50  75 100]
    [  0  25  50  75 100]
# 对数间隔数列
arr=np.logspace(0,4,3,base=2)
print(arr)
    [ 1.  4. 16.]
运行结果如下:
# 特殊矩阵
# 单位矩阵:主对角线上的数字为1,其他的数字为0
arr =np.eye(3,4,dtype=int)
print(arr)

运行结果如下:

    [[1 0 0 0]
     [0 1 0 0]
     [0 0 1 0]]
# 对角矩阵:主对角线上非零的0,其他的数字为0
arr=np.diag([1,2,3]) #主对角线上的数字
print(arr)

运行结果如下:

    [[1 0 0]
     [0 2 0]
     [0 0 3]]
# 随机数组的生成
# 生成0到1之间的随机浮点数(均匀分布)
arr= np.random.rand(2,3)
print (arr)

运行结果如下:

    [[0.68452047 0.14467946 0.74719696]
     [0.68790144 0.36233262 0.72555077]]
# 生成指定范围区间的随机浮点数
arr=np.random.uniform(3,6,(2,3))
print(arr)

运行结果如下:

    [[4.98418627 4.52013717 4.38460385]
     [5.48310141 5.11632599 4.468011  ]]
# 生成指定范围区间的随机整数
arr=np.random.randint(3,30,(2,3))
print(arr)

运行结果如下:

    [[19  8 14]
     [27  3 29]]
#生成随机数列(正态分布)
# 两边小,中间大
arr= np.random.randn(2,3)
print(arr)

运行结果如下:

    [[-1.17280171  0.38570995  0.34056669]
     [-0.90508369  0.15706861 -1.42321051]]
#设置随机种子
np.random.seed(20)
arr= np.random.randint(1,10,(2,5))
print(arr)

运行结果如下:

    [[4 5 7 8 3]
     [1 7 9 6 4]]

4.ndarray的数据类型

布尔类型 bool
整数类型 int uint
浮点数 float
复数 complex

arr = np.array([1,0,2,0],dtype=np.bool)
print(arr)

运行结果如下:

    [ True False  True False]
arr = np.array([1,0,127,0],dtype=np.int8)
print(arr)

运行结果如下:

    [  1   0 127   0]

5.索引与切片

# 一维数组的索引与切片
arr = np.random.randint(1,100,20)
print(arr)

运行结果如下:

    [17 63 17  8 99  7 27 14 76 59 26  4 75 76 62 78 84 58 95 33]
print(arr[10])
print(arr[:]) # 获取全部的数据
print(arr[2:5]) # start:end+1 左包右不包
print(arr[ (arr>10) & (arr<70) ])  # 布尔索引
print(arr[slice(2,15,3)]) # start:end,step

运行结果如下:

    26
    [17 63 17  8 99  7 27 14 76 59 26  4 75 76 62 78 84 58 95 33]
    [17  8 99]
    [17 63 17 27 14 59 26 62 58 33]
    [17  7 76  4 62]
# 二维数组的索引与切片
arr=np.random.randint(1,100,(4,8))
print(arr)

运行结果如下:

    [[11  7 76 19  4 78 18 44]
     [17 19 80 91 60 72 76 30]
     [46  7 64 79 25 19 94 34]
     [79 43 95  4 19 71 53 23]]
print(arr[1,3]) # 索引
print(arr[1,2:5])
print(arr[2][arr[2]>50])
print(arr[:,3])

运行结果如下:

    91
    [80 91 60]
    [64 79 94]
    [19 91 79  4]

6.ndarray的运算

#算术运算
a=np.array([1,2,3])
b = np.array([4,5,6])
print(a+b)
print(a-b)
print(a*b)
print(a/b)
print(a**2)

运行结果如下:

    [5 7 9]
    [-3 -3 -3]
    [ 4 10 18]
    [0.25 0.4  0.5 ]
    [1 4 9]
c=[1,2,3]
d= [4,5,6]
print(c+d)
# print(c-d) 报错
for i in range(len(c)):
    d[i]+=c[i]
print(d)

运行结果如下:

    [1, 2, 3, 4, 5, 6]
    [5, 7, 9]
#算术运算
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([[4,5,6],[7,8,9],[1,2,3]])
print(a+b)
print(a-b)
print(a*b)
print(a/b)
print(a**2)

运行结果如下:

    [[ 5  7  9]
     [11 13 15]
     [ 8 10 12]]
    [[-3 -3 -3]
     [-3 -3 -3]
     [ 6  6  6]]
    [[ 4 10 18]
     [28 40 54]
     [ 7 16 27]]
    [[0.25       0.4        0.5       ]
     [0.57142857 0.625      0.66666667]
     [7.         4.         3.        ]]
    [[ 1  4  9]
     [16 25 36]
     [49 64 81]]
#数组与数字间的算术运算
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a+3)
print(a*3)

运行结果如下:

    [[ 4  5  6]
     [ 7  8  9]
     [10 11 12]]
    [[ 3  6  9]
     [12 15 18]
     [21 24 27]]
# 广播机制 :1.获取形状 2.是否可以广播
# 同一维度:相同 1
a= np.array([1,2,3])
b=np.array([[4],[5],[6]])
print(a+b)
print(b-a)

运行结果如下:

    [[5 6 7]
     [6 7 8]
     [7 8 9]]
    [[3 2 1]
     [4 3 2]
     [5 4 3]]
# a= np.array([1,2,3])
# b=np.array([4,5])
# print(a+b)
# 矩阵运算
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([[4,5,6],[7,8,9],[1,2,3]])
print(a@b)

运行结果如下:

    [[ 21  27  33]
     [ 57  72  87]
     [ 93 117 141]]

二、 numpy中的常用函数

1. 基本数学函数

# 计算平方根
print(np.sqrt(9))
print(np.sqrt([1,4,9]))
arr=np.array([1,25,81])
print(np.sqrt(arr))

运行结果如下:

    3.0
    [1. 2. 3.]
    [1. 5. 9.]
# 计算指数 e^x
print(np.exp(0))

运行结果如下:

    1.0
# 计算自然对数 lnX
print(np.log(2.71))

运行结果如下:

    0.9969486348916096
# 计算正弦值、余弦值
print(np.sin(np.pi/2))
print(np.cos(np.pi))

运行结果如下:

    1.0
    -1.0
# 计算绝对值
arr = np.array([-1,1,2,-3])
print(np.abs(arr))

运行结果如下:

    [1 1 2 3]
# 计算a的b次幂
print(np.power(arr,2))

运行结果如下:

    [1 1 4 9]
# 四舍五入
print(np.round([3.2,4.5,8.1,9.6]))

运行结果如下:

    [ 3.  4.  8. 10.]
# 向上取整,向下取整
arr = np.array([1.6,25.1,81.7])
print(np.ceil(arr))
print(np.floor(arr))

运行结果如下:

    [ 2. 26. 82.]
    [ 1. 25. 81.]
# 检测缺失值NaN
np.isnan([1,2,np.nan,3])

运行结果如下:

    array([False, False,  True, False])

2. 统计函数

求和、计算平均值、计算中位数、标准差、方差
查找最大值、最小值
计算分位数、累积和、累积差

arr=np.random.randint(1,20,8)
print(arr)

运行结果如下:

    [15  5 12  9  7 16 19 15]
# 求和
print(np.sum([1,2,3]))

运行结果如下:

    6
# 计算平均值
print(np.mean(arr))

运行结果如下:

    12.25
# 计算中位数
# 奇数:排序后中间的数值
# 偶数:中间的两个数的平均值
print(np.median([1,2,4]))

运行结果如下:

    2.0
# 计算标准差和方差
#  1,2,3的平均值 2
# ((1-2)^2+(2-2)^2+(3-2)^2)/3=0.6666666666
print(np.var([1,2,3]))
print(np.std([1,2,3]))

运行结果如下:

    0.6666666666666666
    0.816496580927726
# 计算最大值、最小值
print(arr)
print(np.max(arr),np.argmax(arr))
print(np.min(arr),np.argmin(arr))

运行结果如下:

    [15  5 12  9  7 16 19 15]
    19 6
    5 1
# 分位数
# 中位数
print(np.median([1,2,3]))
print(np.median([1,2,3,4]))
np.random.seed(0)
arr = np.random.randint(0,100,4)
print(arr)
print(np.median(arr))
print(np.percentile(arr,20))

运行结果如下:

    2.0
    2.5
    [44 47 64 67]
    55.5
    45.8
# 累积和、累积积
arr = np.array([1,2,3])
print(np.sum(arr))
print(np.cumsum(arr))
print(np.cumprod(arr))

运行结果如下:

    6
    [1 3 6]
    [1 2 6]

3.比较函数

比较是否大于、小于、等于
逻辑与、或、非
检查数组中是否有一个True,是否所有的都为True,自定义条件

# 是否大于
print(np.greater([3,4,5,6,7],4))
# 是否小于
print(np.less([3,4,5,6,7,8],4))
# 是否等于
print(np.equal([3,4,5,6,7,8],4))
print(np.equal([3,4,5],[4,4,4]))

运行结果如下:

    [False False  True  True  True]
    [ True False False False False False]
    [False  True False False False False]
    [False  True False]
print(np.logical_and([0,0],[1,1]))
print(np.logical_or([0,0],[1,0]))
print(np.logical_not([1,0]))

运行结果如下:

    [False False]
    [ True False]
    [False  True]
# 检查元素是否至少有一个元素为True
print(np.any([0,0,0,0.0]))
# 检查是否全部元素为True
print(np.all([1,1]))

运行结果如下:

    False
    True
# 自定义条件
# print(np.where(条件,符合条件,不符合条件))
arr = np.array([1,2,3,4,5])
print(np.where(arr<3,arr,0))

运行结果如下:

    [1 2 0 0 0]
# np.select(条件,返回结果)
score=np.array([80,70,40])
print(np.select([score>80,(score>=60)&(score<=80),score<60],['优秀','良好','不及格'],default='未知'))

运行结果如下:

    ['良好' '良好' '不及格']
# 排序函数
np.random.seed(0)
arr = np.random.randint(1,100,20)
print(arr)
print(arr.sort())
print(arr.argsort())
print(arr)

运行结果如下:

    [45 48 65 68 68 10 84 22 37 88 71 89 89 13 59 66 40 88 47 89]
    None
    [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
    [10 13 22 37 40 45 47 48 59 65 66 68 68 71 84 88 88 89 89 89]
# 去重函数
print(np.unique(arr))

运行结果如下:

    [10 13 22 37 40 45 47 48 59 65 66 68 71 84 88 89]
# 数组的拼接
arr1= np.array([1,2,3])
arr2 = np.array([4,5,6])
print(arr1+arr2)
print(np.concatenate((arr1,arr2)))

运行结果如下:

    [5 7 9]
    [1 2 3 4 5 6]
# 数组的分割
print(np.split(arr,5))

运行结果如下:

    [array([10, 13, 22, 37], dtype=int32), array([40, 45, 47, 48], dtype=int32), array([59, 65, 66, 68], dtype=int32), array([68, 71, 84, 88], dtype=int32), array([88, 89, 89, 89], dtype=int32)]
# 调整数组的形状
print(np.reshape(arr,[5,4]))

运行结果如下:

    [[10 13 22 37]
     [40 45 47 48]
     [59 65 66 68]
     [68 71 84 88]
     [88 89 89 89]]