zoukankan      html  css  js  c++  java
  • np中的温故知新

    1.一维数组中寻找与某个数最近的数

    # 一维数组中寻找与某个数最近的数
    Z=np.random.uniform(0,1,20)
    print("随机数组:
    ",Z)
    z=0.5
    m=Z.flat[np.abs(Z-z).argmin()]
    m
    随机数组:
     [0.87249114 0.64595395 0.10142435 0.46202885 0.15948433 0.53886897
     0.17802543 0.0885369  0.9859855  0.92086206 0.94694556 0.98142637
     0.98578709 0.58045542 0.96260882 0.42125302 0.06691017 0.60032047
     0.51668912 0.44761173]
    
    Out[35]:
    0.5166891167930422


    2. 找出给定一维数组中非 0 元素的位置索引
    Z = np.nonzero([1,0,2,0,1,0,4,0])
    Z
    (array([0, 2, 4, 6]),)


    3.对于给定的 5x5 二维数组,在其内部随机放置 p 个值为 1 的数
    p=3
    Z=np.zeros((5,5))
    z=np.copy(Z)
    
    choice=np.random.choice(range(5*5), p, replace=False)
    print(choice)
    np.put(Z,choice,1)
    print(Z)
    
    np.put(z,np.random.choice(range(3*3),p,replace=False),1)
    Z
    [12 24  8]
    [[0. 0. 0. 0. 0.]
     [0. 0. 0. 1. 0.]
     [0. 0. 1. 0. 0.]
     [0. 0. 0. 0. 0.]
     [0. 0. 0. 0. 1.]]
    
    Out[103]:
    array([[0., 0., 0., 0., 0.],
           [0., 0., 0., 1., 0.],
           [0., 0., 1., 0., 0.],
           [0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 1.]])


    4.对于随机的 3x3 二维数组,减去数组每一行的平均值
    X=np.random.rand(3,3)
    print(X)
    print(X.mean(axis=1,keepdims=True))
    print(X.mean(axis=1,keepdims=False))
    Y=X-X.mean(axis=1,keepdims=True)
    Y
    [[0.85617766 0.21482728 0.44325087]
     [0.44365337 0.47689328 0.34798518]
     [0.96849106 0.99755228 0.05166133]]
    [[0.50475194]
     [0.42284395]
     [0.67256822]]
    [0.50475194 0.42284395 0.67256822]
    
    Out[106]:
    array([[ 0.35142572, -0.28992466, -0.06150107],
           [ 0.02080943,  0.05404934, -0.07485876],
           [ 0.29592283,  0.32498406, -0.62090689]])

    5 获得二维数组点积结果的对角线数组
    A=np.random.uniform(0,1,(3,3))
    B=np.random.uniform(0,1,(3,3))
    
    print(np.dot(A,B))

    [[0.69147934 0.2526067  0.54456377]
     [1.88744045 1.39425446 1.01802782]
     [0.80716853 0.21709932 0.68321853]]
    /慢方法
    np.diag(np.dot(A,B))

    [0.69147934 1.39425446 0.68321853]
    /快方法
    np.sum(A
    *B.T,axis=1)
    [0.69147934 1.39425446 0.68321853]

      # 更快的方法
      np.einsum("ij, ji->i", A, B)

     6.找到随机一维数组中前 p 个最大值

    Z=np.random.randint(1,100,100)
    print(Z)
    p=5
    
    # 法一
    print(np.argsort(Z))
    print(np.argsort(Z)[-p:])
    z1=Z[np.argsort(Z)[-p:]]
    print(z1)
    
    
    # 法二
    print(np.argsort(Z))
    z2=Z[np.argsort(Z)]
    print(z2)
    print(z2[-p:])
    [34 92 73 81 72 69 84 67 84 54 42 55 67 42 26 59 48 41 42 15 15 75 34 65
     56  4 82 85 33 10 51 69 32 59 51 76 13  2 48 55 22 25 44 11 28 62  8 31
     47 75 24 91 61 13 52 24 51 96 77 35 20 98 17 33 24 21 64 23 87 70 59 77
     46 37 90 67 46 24 81 59 29 31 74 67 68 23 43 12 21 37 94 24 69 32 89 20
     76 95 31 66]
    [37 25 46 29 43 87 36 53 20 19 62 95 60 65 88 40 85 67 64 50 55 91 77 41
     14 44 80 47 81 98 32 93 28 63  0 22 59 73 89 17 10 18 13 86 42 72 76 48
     38 16 34 56 30 54  9 39 11 24 70 79 33 15 52 45 66 23 99 83  7 75 12 84
     92  5 31 69  4  2 82 21 49 96 35 58 71  3 78 26  6  8 27 68 94 74 51  1
     90 97 57 61]
    [ 1 90 97 57 61]
    [92 94 95 96 98]
    --------------------------------------------------------------------------- [37 25 46 29 43 87 36 53 20 19 62 95 60 65 88 40 85 67 64 50 55 91 77 41 14 44 80 47 81 98 32 93 28 63 0 22 59 73 89 17 10 18 13 86 42 72 76 48 38 16 34 56 30 54 9 39 11 24 70 79 33 15 52 45 66 23 99 83 7 75 12 84 92 5 31 69 4 2 82 21 49 96 35 58 71 3 78 26 6 8 27 68 94 74 51 1 90 97 57 61] [ 2 4 8 10 11 12 13 13 15 15 17 20 20 21 21 22 23 23 24 24 24 24 24 25 26 28 29 31 31 31 32 32 33 33 34 34 35 37 37 41 42 42 42 43 44 46 46 47 48 48 51 51 51 52 54 55 55 56 59 59 59 59 61 62 64 65 66 67 67 67 67 68 69 69 69 70 72 73 74 75 75 76 76 77 77 81 81 82 84 84 85 87 89 90 91 92 94 95 96 98] [92 94 95 96 98]

    7.对于二维随机数组中各元素,保留其 2 位小数
    Z=np.random.random((5,5))
    print(Z)
    np.set_printoptions(precision=2)
    Z
    [[0.45389061 0.00459791 0.42885481 0.87764257 0.66726466]
     [0.79804312 0.54167802 0.67716846 0.3160879  0.2175134 ]
     [0.57729706 0.60136079 0.25779121 0.93762588 0.98816545]
     [0.11628811 0.46043354 0.2167248  0.63628797 0.84759436]
     [0.59625979 0.34086979 0.36992923 0.44203274 0.78498223]]
    
    Out[161]:
    array([[0.45, 0.  , 0.43, 0.88, 0.67],
           [0.8 , 0.54, 0.68, 0.32, 0.22],
           [0.58, 0.6 , 0.26, 0.94, 0.99],
           [0.12, 0.46, 0.22, 0.64, 0.85],
           [0.6 , 0.34, 0.37, 0.44, 0.78]])

    4使用科学记数法输出 NumPy 数组
    Z = np.random.random([5,5])
    print(Z)
    
    Z/1e3
    [[0.01 0.9  0.64 0.68 0.46]
     [0.61 0.   0.4  0.09 0.02]
     [0.83 0.1  0.72 0.87 0.09]
     [0.49 0.15 0.37 0.43 0.27]
     [0.48 0.87 0.4  0.38 0.57]]
    
    Out[88]:
    array([[6.47e-06, 9.04e-04, 6.37e-04, 6.83e-04, 4.62e-04],
           [6.13e-04, 1.82e-06, 4.02e-04, 8.70e-05, 2.10e-05],
           [8.34e-04, 9.52e-05, 7.16e-04, 8.68e-04, 9.34e-05],
           [4.93e-04, 1.49e-04, 3.73e-04, 4.32e-04, 2.73e-04],
           [4.85e-04, 8.66e-04, 4.04e-04, 3.83e-04, 5.70e-04]])

    5.使用 NumPy 找出百分位点(25%,50%,75%)
    a=np.arange(15)
    print(a)
    np.percentile(a,q=[25,50,75])
    [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
    
    Out[165]:
    array([ 3.5,  7. , 10.5])

    6.找出数组中缺失值的总数及所在位置
    # 生成含缺失值的 2 维数组
    Z = np.random.rand(10,10)
    Z[np.random.randint(10, size=5), np.random.randint(10, size=5)] = np.nan
    Z
    array([[0.8 , 0.25, 0.74, 0.05, 0.24, 0.16, 0.63, 0.62, 0.89, 0.85],
           [0.61, 0.76, 0.26, 0.3 , 0.82, 0.74, 0.96, 0.64, 0.58, 0.06],
           [0.78, 0.38, 0.19, 0.68, 0.75, 0.91, 0.13, 0.24, 0.98, 0.21],
           [0.47, 0.12, 0.34, 0.06, 0.46, 0.69, 0.1 ,  nan, 0.27, 0.92],
           [0.83, 0.01, 0.63, 0.15, 0.52, 0.52, 0.02, 0.  , 0.74, 0.59],
           [0.56, 0.66, 0.15,  nan, 0.26, 0.88, 0.15, 0.57, 0.61, 0.35],
           [0.33, 0.58, 0.06, 0.94, 0.58, 0.53, 0.97, 0.02, 0.32,  nan],
           [0.84, 0.71, 0.65, 0.42, 0.44, 0.96, 0.37, 0.65, 0.6 , 0.17],
           [0.04, 0.94, 0.92,  nan, 0.7 , 0.38, 0.28, 0.45, 0.35, 0.93],
           [0.38, 0.69, 0.43, 0.01, 0.67, 0.46, 0.73, 0.99, 0.94, 0.45]]
    print("缺失值总数: 
    ", np.isnan(Z).sum())
    print("缺失值索引: 
    ", np.where(np.isnan(Z)))
    缺失值总数: 
     4
    缺失值索引: 
     (array([3, 5, 6, 8]), array([7, 3, 9, 3]))
    =>(3,7)(5,3)(6,9)(8,3)
    #从随机数组中删除包含缺失值的行
    Z[np.sum(np.isnan(Z),axis=1)==0]

    6.统计随机数组中的各元素的数量

    Z=np.random.randint(0,10,100).reshape(10,10)
    print(Z)
    
    np.unique(Z,return_counts=True)
    [[0 0 0 8 1 6 2 8 4 4]
     [2 7 8 0 8 5 7 5 6 3]
     [7 0 0 9 3 4 7 5 7 3]
     [8 2 3 3 7 5 6 4 3 2]
     [4 9 9 1 0 4 0 4 7 8]
     [8 0 3 5 5 8 0 5 9 1]
     [4 9 9 1 2 0 7 0 9 0]
     [2 8 1 3 2 1 4 0 9 8]
     [9 9 7 6 7 1 3 5 6 9]
     [2 2 9 9 0 7 3 9 5 3]]
    
    Out[22]:
    (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
     array([15,  7,  9, 11,  9,  9,  5, 11, 10, 14]))


    7.得到二维随机数组各行的最大值
    Z = np.random.randint(1,100, [5,5])
    print(Z)
    
    np.amax(Z, axis=1)
    [[92 27 63 19 73]
     [96 75 43 50 11]
     [ 5 32 62 92 13]
     [ 7  3 75 68 42]
     [63 27 94 82 88]]
    
    Out[97]:
    array([92, 96, 92, 75, 94])

    Z=np.random.randint(1,100,[5,5])
    print(Z)
    np.apply_along_axis(np.min,arr=Z,axis=1)
    [[82 92 48 60 13]
     [29 62 23 34 94]
     [55 59 18 62 45]
     [84 19 95 36 24]
     [54 90 44 31 42]]
    
    Out[14]:
    array([13, 23, 18, 19, 31])

    8.计算两个数组之间的欧氏距离
    a=np.array([1,2])
    b=np.array([7,8])
    
    print(np.sqrt(np.power((8-2),2)+np.power((7-1),2)))
      8.48528137423857

    9.求解给出矩阵的逆矩阵并验证
    matrix = np.array([[1., 2.], [3., 4.]])
    
    inverse_matrix = np.linalg.inv(matrix)
    
    # 验证原矩阵和逆矩阵的点积是否为单位矩阵
    assert np.allclose(np.dot(matrix, inverse_matrix), np.eye(2))
    
    inverse_matrix
    array([[-2. ,  1. ],
           [ 1.5, -0.5]])


    10-12都是数据标准化处理
    10.使用 Z-Score 标准化算法对数据进行标准化处理
    
    
    #根据Z-Scor公式定义函数
    def zscore(x,axis=None):
        xmean=x.mean(axis=axis,keepdims=True)
        xstd=np.std(x,axis=axis,keepdims=True)
        zscore=(x-xmean)/xstd
        return zscore
    
    #生成随机矩阵
    Z=np.random.randint(10,size=(5,5))
    print(Z)
    
    zscore(Z)
    [[9 7 1 9 6]
     [8 2 8 4 7]
     [2 6 7 1 5]
     [7 6 6 7 0]
     [7 9 5 5 3]]
    
    Out[28]:
    array([[ 1.35690061,  0.58593435, -1.72696441,  1.35690061,  0.20045123],
           [ 0.97141748, -1.34148129,  0.97141748, -0.57051503,  0.58593435],
           [-1.34148129,  0.20045123,  0.58593435, -1.72696441, -0.1850319 ],
           [ 0.58593435,  0.20045123,  0.20045123,  0.58593435, -2.11244754],
           [ 0.58593435,  1.35690061, -0.1850319 , -0.1850319 , -0.95599816]])


    11.使用 Min-Max 标准化算法对数据进行标准化处理
    
    
    #数据公式熟悉
    x=np.array([[1,2],[3,4]])
    min=x.min(axis=None,keepdims=True)
    mean=x.mean(axis=None,keepdims=True)
    print(min)
    print(mean)
    print(x-min)
    [[1]]
    [[2.5]]
    [[0 1] [2 3]]
    #定义Min-Max 标准化公式
    def min_max(x,axis=None):
        min=x.min(axis=axis,keepdims=True)
        max=x.max(axis=axis,keepdims=True)
        result=(x-min)/(max-min)
        return result
    
    #生成随机数据
    Z=np.random.randint(10,size=(5,5))
    print(Z)
    print(Z.min())
    #0
    print(Z.max())
    #9
    min_max(Z)
    [[4 6 8 0 3]
     [9 2 6 3 0]
     [3 0 6 5 9]
     [1 5 2 6 8]
     [4 0 4 3 7]]
    0
    9
    
    Out[37]:
    array([[0.44444444, 0.66666667, 0.88888889, 0.        , 0.33333333],
           [1.        , 0.22222222, 0.66666667, 0.33333333, 0.        ],
           [0.33333333, 0.        , 0.66666667, 0.55555556, 1.        ],
           [0.11111111, 0.55555556, 0.22222222, 0.66666667, 0.88888889],
           [0.44444444, 0.        , 0.44444444, 0.33333333, 0.77777778]])

    12.使用 L2 范数对数据进行标准化处理

    x=np.array([[1,1],
    [2,2]])

    #axis=1 按列 算行
    l2 = np.linalg.norm(x, ord = 2, axis=1, keepdims=True)
    print(l2)
    #非零处理
    l2[l2==0]=1
    print(l2)

    array([[1.41421356],
           [2.82842712]])
    array([[1.41421356],
           [2.82842712]])
    
    
    # 根据l2公式定义函数
    def l2_normalize(v, axis=-1, order=2):
        l2 = np.linalg.norm(v, ord = order, axis=axis, keepdims=True)
        l2[l2==0] = 1
        return v/l2
    
    # 生成随机数据
    Z = np.random.randint(10, size=(5,5))
    print(Z)
    
    l2_normalize(Z)
    [[5 6 6 9 7]
     [1 8 5 1 8]
     [6 1 3 5 3]
     [7 1 2 6 0]
     [9 4 0 8 8]]
    
    Out[104]:
    array([[0.33, 0.4 , 0.4 , 0.6 , 0.46],
           [0.08, 0.64, 0.4 , 0.08, 0.64],
           [0.67, 0.11, 0.34, 0.56, 0.34],
           [0.74, 0.11, 0.21, 0.63, 0.  ],
           [0.6 , 0.27, 0.  , 0.53, 0.53]])

    13 keepdims 属性的含义
    import numpy as np
    a = np.array([[1,2],[3,4]])
    
    # 按行相加,并且保持其二维特性
    print(np.sum(a, axis=1, keepdims=True))
    
    # 按行相加,不保持其二维特性
    print(np.sum(a, axis=1))
    输出
    [[3]
     [7]]
    ------- [3 7]

    14.计算变量直接的相关性系数
    Z = np.array([
        [1, 2, 1, 9, 10, 3, 2, 6, 7], # 特征 A
        [2, 1, 8, 3, 7, 5, 10, 7, 2], # 特征 B
        [2, 1, 1, 8, 9, 4, 3, 5, 7]]) # 特征 C
    
    np.corrcoef(Z)
         [A]     [B]     [C]
    array([[ 1.  , -0.06,  0.97]   [A]
           [-0.06,  1.  , -0.01],  [B]
           [ 0.97, -0.01,  1.  ]]) [C]

    相关性系数取值从 0-1 变换,靠近 1 则代表相关性较强。结果如下所示,变量 A 与变量 A 直接的相关性系数为 1,因为是同一个变量;变量 A 与 变量 B 之间的相关性系数为 -0.06,说明几乎不相关。变量 A 与变量 C 之间的相关性系数为 0.97,说明相关性较强

    15.计算矩阵的特征值和特征向量

    M = np.matrix([[1,2,3], [4,5,6], [7,8,9]])
    
    w, v = np.linalg.eig(M)
    
    # w 对应特征值,v 对应特征向量
    w, v
    (array([ 1.61168440e+01, -1.11684397e+00, -9.75918483e-16]),
     matrix([[-0.23197069, -0.78583024,  0.40824829],
             [-0.52532209, -0.08675134, -0.81649658],
             [-0.8186735 ,  0.61232756,  0.40824829]]))
    可以通过 P'AP=M 公式反算,验证是否能得到原矩阵。
    v*np.diag(w)*np.linalg.inv(v)
    matrix([[1., 2., 3.],
            [4., 5., 6.],
            [7., 8., 9.]])

    16.数组连接
       按行连接两个数组
    M1 = np.array([1, 2, 3])
    M2 = np.array([4, 5, 6])
    
    np.r_[M1, M2]
    array([1, 2, 3, 4, 5, 6])
      
      按列连接两个数组
    M1 = np.array([1, 2, 3])
    M2 = np.array([4, 5, 6])
    
    np.c_[M1, M2]
    array([[1, 4],
           [2, 5],
           [3, 6]])
      
      将多个 1 维数组拼合为单个 Ndarray:
    Z1=np.arange(3)
    Z2=np.arange(3,7)
    Z3=np.arange(7,10)
    
    Z=np.array([Z1,Z2,Z3])
               
    print(Z)
    np.concatenate(Z)
    [array([0, 1, 2]) array([3, 4, 5, 6]) array([7, 8, 9])]
    
    Out[8]:
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])



     
     





  • 相关阅读:
    什么是同源策略,什么是跨域,如何跨域,Jsonp/CORS跨域
    Scrapy
    爬虫
    Falsk-信号
    python函数中把列表(list)当参数时的"入坑"与"出坑"
    SQLAlchemy基本使用(Flask中)
    列表生成式&生成器表达式
    javascript数据结构——队列
    javascript数据结构——栈
    js数组去重的几种方法
  • 原文地址:https://www.cnblogs.com/wqbin/p/10212829.html
Copyright © 2011-2022 走看看