数据分析:Numpy的基本操作-Python

开个新坑,为下学期的大数据专业做准备
就从数据分析的基本工具Numpy开始吧~

数组的创建


import numpy as np

np.array([1,2,3])                       # 创建一个一维数组
np.array([1,2,3],dtype=float)           # float类型的二维列表
np.array([[1,2,3],[4,5,6],[7,8,9]])     # 创建一个二维数组

np.arange(6)                            # 按顺序创建数组 [0 1 2 3 4 5]
np.arange(1,6,3)                        # 创建1-6之间步长为3的数组 [1 4]

np.linspace(1,6,3,dtype=int)            # 创建1-6之间数列长度为3的数组 [1 3 6]
np.logspace(2,3,num=3,dtype=int)                  # 创建10^2-10^3之间数列长度为4的数组[ 100 316 1000]

np.zeros([2,10])                # 创建一个2x10的二维数组,所有元素都为0
np.ones([2,10])                 # 创建一个2x10的二维数组,所有元素都为1

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
np.ones_like(a)                 # 创建一个"形状"和a数组相同,所有元素都是1的数组
np.zeros_like(a)                # 作用同ones_like,但所有元素都是0

# 创建一个4x4的数组,可设置对角线数值为1
np.eye(4)
#### [[1. 0. 0. 0.]
####  [0. 1. 0. 0.]
####  [0. 0. 1. 0.]
####  [0. 0. 0. 1.]]

np.eye(4,k=1)
#### [[0. 1. 0. 0.]
####  [0. 0. 1. 0.]
####  [0. 0. 0. 1.]
####  [0. 0. 0. 0.]]

np.eye(4,k=-1)
#### [[0. 0. 0. 0.]
####  [1. 0. 0. 0.]
####  [0. 1. 0. 0.]
####  [0. 0. 1. 0.]]

# 创建以指定元素为对角线的数组
np.diag([1,2,3,4],k=1)
#### [[0 1 0 0 0]
####  [0 0 2 0 0]
####  [0 0 0 3 0]
####  [0 0 0 0 4]
####  [0 0 0 0 0]]

数组的几种属性


d1 = np.array([1,2,3])
d1.dtype                     # 获取数组元素的类型 int32
d1.astype(float)             # 临时修改数组元素类型为float

d2 = np.array([[1,2,3],[4,5,6]])
d2.shape                     # 获取数组的"形状"  (2, 3)
d2.size                      # 获取数组的大小 6
d2.ndim                      # 获取数组的维度 2

d3 = np.arange(24)
d4 = d3.reshape(2,3,4)       # 改变数组的"形状"
#### [[[ 0  1  2  3]
####   [ 4  5  6  7]
####   [ 8  9 10 11]]
####
####  [[12 13 14 15]
####   [16 17 18 19]
####   [20 21 22 23]]]

数组的索引和切片


  1. 一维数组的索引

    s1 = np.array([0,10,20,30,40,50])
    s1[3]                       # 获取下标为3的元素 30
    s1[[3]]                     # 获取下标为3的元素,格式为数组 [30]
    s1[[1,3]]                   # 取出下标为1和3的元素组成新的数组 [10 30]
    s1[0] = 100                 # 修改元素值
    
  2. 二维数组的索引

    • 以整数为下标
      s2 = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
      s2[0]                       # 获取第一行列表 [1 2 3]
      s2[0][1]                    # 第一行第二个元素 2
      s2[0,1]                     # 第一行第二个元素 2
      s2[0] = 100                 # 将第一行全部赋100
      
    • 以列表为下标
      s2[[1,2]]                   # 取第2,3行的列表[[4 5 6],[7 8 9]]
      s2[[2,3],[1,2]]             # 取[2,1]和[3,2]的元素组成新列表[8 12]
      s2[[2,1,2,1]]               # 取第2,1,2,1行元素组成新的二维列表 ↓
      #### [[7 8 9]
      ####  [4 5 6]
      ####  [7 8 9]
      ####  [4 5 6]]
      
    • 以数组为下标
      • 一维数组的例子
        v = np.array([1,3,4])
        s3 = np.array([0,10,20,30,40])
        s3[v]               # 以数组1,3,4为下标,将s3中所对应下标的元素取出 [10 30 40]
        t = s3 == 40        # 判断s3,等于40则为True,返回一个列表 [False False False False True]
        s3[t]               # 返回t为True所在下标的元素列表 [40]
        
      • 二维数组的例子
        s4 = np.array([[0,1,2,3,4],
                      [5,6,7,8,9]])
        t = s4 % 2 == 0     # 找出s4中能被2整除的偶数 ↓
        #### [[ True False  True False  True]
        ####  [False  True False  True False]]
        

切片


  1. 一维数组的切片
    s5 = np.array([1,2,3,4,5])
    s5[2:4]             # 将下标2-4之间的元素切片 [3 4 5]
    
  2. 二维数组的切片
    s6 = np.array([[1,2,3],
                   [4,5,6],
                   [7,8,9],
                   [10,11,12]])
    s6[1:3]             # 将下标1-2的列表切片取出 ↓
    # [[4 5 6]
    #  [7 8 9]]
    s6[1:3,2:3]         # 输出如下 ↓
    # [[5 6]
    #  [8 9]]
    s6[::2,::2]         # 每隔一个取一个 输出如下 ↓
    # [[1 3]
    #  [7 9]]
    

数组的变形


np.arange(10).reshape((2,5))     # 将一维数组格式化为2x5的二维数组
# [[0 1 2 3 4]
#  [5 6 7 8 9]]

a = np.arange(10)
b = np.reshape(a,(2,5))         # 将a格式化为2x5
# [[0 1 2 3 4]
#  [5 6 7 8 9]]

c = b.reshape(-1,2)             # (-1,2)代表行数不变,列数变为2
# [[0 1]
#  [2 3]
#  [4 5]
#  [6 7]
#  [8 9]]

np.reshape(b,(10,))             # (10,)代表格式化为一维数组,0轴有10个元素
# [0 1 2 3 4 5 6 7 8 9]

np.reshape(b,(1,10))            # (1,10)代表0轴1个元素,这个元素包含10个元素
# [[0 1 2 3 4 5 6 7 8 9]]

b.shape = (1,10)                # 通过改变shape的值来改变数组的形状

b.flatten()                     # 将二维数组b"扁平化"为一维数组,或np.flatten(b)
# [0 1 2 3 4 5 6 7 8 9]

d = np.ravel(b)                 # 与np.flatten(b)效果相同
# [0 1 2 3 4 5 6 7 8 9]


最后一行中b和d的数据是共享的,一个修改之后,另一个的数据也会改变

数组的组合


以以下两个二维数组为例

a = np.arange(9).reshape((3,3))
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]

b = np.arange(12).reshape((3,4))
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

  1. 水平组合
    np.hstack((a,b))
    # [[ 0  1  2  0  1  2  3]
    #  [ 3  4  5  4  5  6  7]
    #  [ 6  7  8  8  9 10 11]]
    
    np.concatenate((a,b),axis=1) # 沿1轴方向进行组合,结果与上面相同
    
  2. 垂直组合
    # np.vstack((a,b)) 会报错,因为列数不同
    np.vstack((a,b.T)) # b.T将b转置,使其与a的列数相同,则可以组合
    # [[ 0  1  2]
    #  [ 3  4  5]
    #  [ 6  7  8]
    #  [ 0  4  8]
    #  [ 1  5  9]
    #  [ 2  6 10]
    #  [ 3  7 11]]
    np.concatenate((a,b),axis=1) # 沿0轴方向进行组合,结果与上面相同
    

数组的分割


以以下二维数组为例

a = np.arange(24).reshape(4,6)
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]
#  [12 13 14 15 16 17]
#  [18 19 20 21 22 23]]
  1. 沿1轴水平分割
    b= np.split(a,2,axis=1) # 沿1轴方向将a切分成两部分
    # [array([[ 0,  1,  2],
    #         [ 6,  7,  8],
    #         [12, 13, 14],
    #         [18, 19, 20]]), 
    #  array([[ 3,  4,  5],
    #         [ 9, 10, 11],
    #         [15, 16, 17],
    #         [21, 22, 23]])]
    b = np.hsplit(a,2) # 与上述结果相同
    
  2. 沿0轴垂直分割
    b= np.split(a,2,axis=0) # 沿0轴方向将a切分成两部分
    # [array([[ 0,  1,  2,  3,  4,  5],
    #         [ 6,  7,  8,  9, 10, 11]]), 
    #  array([[12, 13, 14, 15, 16, 17],
    #         [18, 19, 20, 21, 22, 23]])]
    b = np.vsplit(a,2) # 与上述结果相同
    

数组的运算


  1. 基本运算
    a = np.array([1,2,3])
    b = np.array([4,5,6])
    
    # 将每一项都加减乘或除一个数
    a * 10      # [10 20 30]
    a + 10      # [11 12 13]
    a - 10      # [-9 -8 -7]
    a / 10      # [0.1 0.2 0.3]
    
    # 数组之间对应项之间加减乘除
    a + b       # [5 7 9]
    a - b       # [-3 -3 -3]
    a * b       # [ 4 10 18]
    a / b       # [0.25 0.4 0.5]
    
    ## 形状不同的情况
    a = np.array([1,2,3])
    b = np.array([[1,2,3],
                  [4,5,6]])
    c = np.array([[1],
                  [2]])
    
    # a数组自动扩展为2维与b进行计算,这称为"广播"
    a + b       
    # [[2 4 6]
    #  [5 7 9]]
    
    c + b   # 对c数组进行向右广播
    # [[2 3 4]
    #  [6 7 8]]
    
  2. 比较运算
    np.array([1,2,3]) > np.array([3,1,2])   # 对应项之间进行比较 [False  True  True]
    # np.array([1,2,3]) > np.array([3,1]) 数组形状不相同,会报错
    
  3. numpy的逻辑运算
    a = np.array([False,True])
    b = np.array([True,False])
    np.logical_or(a,b)      # 逻辑或 [ True  True]
    np.logical_and(a,b)     # 逻辑与 [False False]
    
    c = np.array([1,2,3])
    d = np.array([4,5,6])
    ### any
    np.any(c > d)           # 只要c的中有任何一个大于d的对应项,则为True  此处为False
    (c > d).any()           # 与上述效果相同
    ### all
    np.all(c < d)           # 只有c中所有元素都小于d的对应项,才为True,此处为True
    (c < d).all()           # 与上述效果相同
    
  4. 通用函数

猜你喜欢

转载自blog.csdn.net/qq_15989473/article/details/107543791