• 【python与数据分析】NumPy数值计算基础1——numpy数组及其运算


    目录

    前言

    一、创建数组

    二、测试两个数组的对应元素是否足够接近

    三、修改数组中的元素值

    四、数组与标量的运算

    五、数组与数组的运算

    六、数组排序

    七、数组重复

    八、数组转置

    九、数组所有元素累计和与累计积

    十、数据的集合运算

    十一、数组的点积/内积运算

    十二、访问数组中的元素

    十三、数组切片

    十四、数组对函数运算的支持

    十五、改变数组形状

    十六、数组扁平化,变为一维数组

    十七、数组切分

    十八、取整运算

    十九、广播(数组与标量的加法)

    二十、计算唯一值以及出现次数

    二十一、数组布尔运算

    二十二、分段函数

    二十三、删除数组中的元素


    前言

    • 熟练掌握numpy数组相关运算
    • 熟练使用numpy创建矩阵
    • 理解矩阵转置和乘法
    • 熟练计算数据的相关系数、方差、协方差、标准差
    • 理解并能够计算特征值与特征向量
    • 理解可逆矩阵并能够计算矩阵的逆
    • 熟练求解线性方程组
    • 熟练计算向量和矩阵的范数
    • 理解并计算奇异值分解

    一、创建数组

    1. >>>import numpy as np
    2. >>>np.array([1,2,3,4,5]) #把列表转换为一维数组
    3. array([1, 2, 3, 4, 5])
    4. >>>print(_)
    5. [1 2 3 4 5]
    6. >>>np.array((1,2,3,4,5)) #把元组转换为一维数组
    7. array([1, 2, 3, 4, 5])
    8. >>>np.array(range(5)) #把range对象转换成一维数组
    9. array([0, 1, 2, 3, 4])
    10. >>>arr=np.array([[1,2,3],[4,5,6]]) #二维数组,外[]不可少
    11. >>>arr
    12. array([[1, 2, 3],
    13. [4, 5, 6]])
    14. >>>print(arr)
    15. [[1 2 3]
    16. [4 5 6]]
    17. >>>np.arange(8) #类似于内置函数range()
    18. array([0, 1, 2, 3, 4, 5, 6, 7])
    19. >>>np.arange(1,10,2)
    20. array([1, 3, 5, 7, 9])
    21. >>>np.linspace(0,10,11) #等差数组,包含11个数
    22. array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
    23. >>>np.linspace(0,10,11,endpoint=False) #不包含终点
    24. array([0. , 0.90909091, 1.81818182, 2.72727273, 3.63636364,
    25. 4.54545455, 5.45454545, 6.36363636, 7.27272727, 8.18181818,
    26. 9.09090909])
    27. >>>np.logspace(0,100,10) #相当于10**np.linspace(0,100,10)
    28. array([1.00000000e+000, 1.29154967e+011, 1.66810054e+022, 2.15443469e+033,
    29. 2.78255940e+044, 3.59381366e+055, 4.64158883e+066, 5.99484250e+077,
    30. 7.74263683e+088, 1.00000000e+100])
    31. >>>np.logspace(1,6,5,base=2) #相当于2**np.linspace(1,,6,5)
    32. array([ 2. , 4.75682846, 11.3137085 , 26.90868529, 64. ])
    33. >>>np.zeros(3) #全0一维数组
    34. array([0., 0., 0.])
    35. >>>np.ones(3) #全1一维数组
    36. array([1., 1., 1.])
    37. >>>np.zeros((3,3)) #全零二维数组,三行三列
    38. array([[0., 0., 0.],
    39. [0., 0., 0.],
    40. [0., 0., 0.]])
    41. >>>np.zeros((3,1)) #全零二维数组,三行一列
    42. array([[0.],
    43. [0.],
    44. [0.]])
    45. >>> np.zeros((1,3)) #全零二维数组,一行三列
    46. array([[0., 0., 0.]])
    47. >>> np.ones((3,3)) #全1二维数组,三行三列
    48. array([[1., 1., 1.],
    49. [1., 1., 1.],
    50. [1., 1., 1.]])
    51. >>> np.ones((1,3)) #全一二维数组,一行三列
    52. array([[1., 1., 1.]])
    53. >>> np.identity(3) #单位矩阵,三行三列
    54. array([[1., 0., 0.],
    55. [0., 1., 0.],
    56. [0., 0., 1.]])
    57. >>> np.random.randint(0,50,5) #随机数组,5个0-50之间的数字
    58. array([49, 34, 36, 34, 27])
    59. >>> np.random.randint(0,50,(3,5)) #三行五列,共15个随机数,都介于[0,50]
    60. array([[36, 13, 39, 15, 40],
    61. [26, 32, 14, 27, 22],
    62. [ 2, 5, 15, 14, 14]])
    63. >>> np.random.rand(10) #10个介于[0,1)的随机数
    64. array([0.1339926 , 0.91646838, 0.05426131, 0.19442916, 0.16623762,
    65. 0.2365288 , 0.33290243, 0.250113 , 0.96977386, 0.59846432])
    66. >>> np.random.standard_normal(5) #从标准正态分布中随机采样五个数字
    67. array([-0.97958578, 0.0814909 , 0.89747636, -1.23791227, -0.73942231])
    68. >>> x=np.random.standard_normal(size=(3,4,2))
    69. >>> x
    70. array([[[ 1.1494124 , -0.47706184],
    71. [-1.10716196, 0.28543639],
    72. [ 0.05352001, -0.45464289],
    73. [ 0.2345641 , 0.954789 ]],
    74. [[-1.20323603, 2.6723773 ],
    75. [-0.49191396, -2.1001691 ],
    76. [ 0.18914176, -0.52134758],
    77. [-1.25792163, 0.03047616]],
    78. [[-0.98496622, -0.59795298],
    79. [ 0.81130705, 0.56014691],
    80. [ 0.27234357, -0.87448426],
    81. [-0.26274332, -0.91526728]]])
    82. >>> np.diag([1,2,3,4]) #对角矩阵
    83. array([[1, 0, 0, 0],
    84. [0, 2, 0, 0],
    85. [0, 0, 3, 0],
    86. [0, 0, 0, 4]])

    二、测试两个数组的对应元素是否足够接近

    1. >>> import numpy as np
    2. >>> x=np.array([1,2,3,4.001,5])
    3. >>> y=np.array([1,1.9999,3,4.01,5.1])
    4. >>> print(np.allclose(x,y))
    5. False
    6. >>> print(np.allclose(x,y,rtol=0.2)) #设置相对误差参数
    7. True
    8. >>> print(np.allclose(x,y,atol=0.2)) #设置绝对误差参数
    9. True
    10. >>> print(np.isclose(x,y))
    11. [ True False True False False]
    12. >>> print(np.isclose(x,y,atol=0.2))
    13. [ True True True True True]

    三、修改数组中的元素值

    1. >>> x=np.arange(8)
    2. >>> x
    3. array([0, 1, 2, 3, 4, 5, 6, 7])
    4. >>> np.append(x,8) #返回新数组,在尾部追加一个元素
    5. array([0, 1, 2, 3, 4, 5, 6, 7, 8])
    6. >>> np.append(x,[9,10]) #返回新数组,在尾部追加多个元素
    7. array([ 0, 1, 2, 3, 4, 5, 6, 7, 9, 10])
    8. >>> x #不影响原来的数组
    9. array([0, 1, 2, 3, 4, 5, 6, 7])
    10. >>> x[3]=8 #使用下标的形式原地修改元素值
    11. >>> x #原来的数组被修改了
    12. array([0, 1, 2, 8, 4, 5, 6, 7])
    13. >>> np.insert(x,1,8) #返回新数组,插入元素
    14. array([0, 8, 1, 2, 8, 4, 5, 6, 7])
    15. >>> x.put(0,9) #修改原数组指定位置上的元素
    16. >>> x=np.array([[1,2,3],[4,5,6],[7,8,9]])
    17. >>> x[0,2]=4 #修改第0行到第2列的元素值
    18. >>> x[1:,1:]=1 #切片,把行下标大于等于1,且列下标也大于等于1的元素值都设置为1
    19. >>> x
    20. array([[1, 2, 4],
    21. [4, 1, 1],
    22. [7, 1, 1]])
    23. >>> x[1:,1:]=[1,2] #同时修改多个元素值
    24. >>> x
    25. array([[1, 2, 4],
    26. [4, 1, 2],
    27. [7, 1, 2]])
    28. >>> x[1:,1:]=[[1,2],[3,4]]
    29. >>> x
    30. array([[1, 2, 4],
    31. [4, 1, 2],
    32. [7, 3, 4]])

    四、数组与标量的运算

    1. >>> import numpy as np
    2. >>> x=np.array((1,2,3,4,5))
    3. >>> x
    4. array([1, 2, 3, 4, 5])
    5. >>> x*2
    6. array([ 2, 4, 6, 8, 10])
    7. >>> x/2
    8. array([0.5, 1. , 1.5, 2. , 2.5])
    9. >>> x//2
    10. array([0, 1, 1, 2, 2], dtype=int32)
    11. >>> x**3
    12. array([ 1, 8, 27, 64, 125], dtype=int32)
    13. >>> x+2
    14. array([3, 4, 5, 6, 7])
    15. >>> x%3
    16. array([1, 2, 0, 1, 2], dtype=int32)
    17. >>> 2**x
    18. array([ 2, 4, 8, 16, 32], dtype=int32)
    19. >>> 2/x
    20. array([2. , 1. , 0.66666667, 0.5 , 0.4 ])
    21. >>> 63//x

    五、数组与数组的运算

    1. >>> np.array([1,2,3,4])+np.array([4,3,2,1])
    2. array([5, 5, 5, 5])
    3. >>> np.array([1,2,3,4])+np.array([4])
    4. array([5, 6, 7, 8])
    5. >>> a=np.array((1,2,3))
    6. >>> a+a
    7. array([2, 4, 6])
    8. >>> a*a
    9. array([1, 4, 9])
    10. >>> a-a
    11. array([0, 0, 0])
    12. >>> a/a
    13. array([1., 1., 1.])
    14. >>> a**a
    15. array([ 1, 4, 27])
    16. >>> b=np.array([[1,2,3],[4,5,6],[7,8,9]])
    17. >>> c=a*b
    18. >>> c
    19. array([[ 1, 4, 9],
    20. [ 4, 10, 18],
    21. [ 7, 16, 27]])
    22. >>> a+b
    23. array([[ 2, 4, 6],
    24. [ 5, 7, 9],
    25. [ 8, 10, 12]])

    六、数组排序

    1. >>>x=np.array([3,1,2])
    2. >>>np.argsort(x) #返回排序后元素的原下标
    3. array([1, 2, 0], dtype=int64)
    4. >>>x[_] #使用数组做下标,获取对应位置的元素
    5. array([1, 2, 3])
    6. >>>x=np.array([3,1,2,4])
    7. >>> x.argmax(),x.argmin() #最大值和最小值的下标
    8. (3, 1)
    9. >>> np.argsort(x)
    10. array([1, 2, 0, 3], dtype=int64)
    11. >>> x[_]
    12. array([1, 2, 3, 4])
    13. >>> x.sort() #原地排序
    14. >>> x
    15. array([1, 2, 3, 4])
    16. >>> x=np.random.randint(1,100,10) #随机整数
    17. >>> x
    18. array([39, 94, 74, 83, 60, 20, 76, 71, 81, 20])
    19. >>> np.argsort(x) #排序后原下标
    20. array([5, 9, 0, 4, 7, 2, 6, 8, 3, 1], dtype=int64)
    21. >>> x[_] #按序访问元素
    22. array([20, 20, 39, 60, 71, 74, 76, 81, 83, 94])
    23. >>> x[sorted(np.argsort(x)[-5:])] #按原来的顺序返回最大的五个数
    24. array([94, 74, 83, 76, 81])
    25. >>> x=np.array([[0,3,4],[2,2,1]])
    26. >>> np.argsort(x,axis=0) #二维数组纵向排序,返回原下标
    27. array([[0, 1, 1],
    28. [1, 0, 0]], dtype=int64)
    29. >>> np.argsort(x,axis=1) #二维数组横向排序
    30. array([[0, 1, 2],
    31. [2, 0, 1]], dtype=int64)
    32. >>> x.sort(axis=1) #原地排序,横向;注意,是每行单独排序
    33. >>> x
    34. array([[0, 3, 4],
    35. [1, 2, 2]])
    36. >>> x.sort(axis=0) #原地排序,纵向,每列单独排序
    37. >>> x
    38. array([[0, 2, 2],
    39. [1, 3, 4]])

    七、数组重复

    1. >>> import numpy as np
    2. >>> x=np.array([1,2,3])
    3. >>> x.repeat(3) #每个元素都重复3次
    4. array([1, 1, 1, 2, 2, 2, 3, 3, 3])
    5. >>> x.repeat([1,2,3]) #三个元素分别重复1,2,3次
    6. array([1, 2, 2, 3, 3, 3])
    7. >>> x=np.random.randint(1,10,(2,3))
    8. >>> x
    9. array([[4, 4, 9],
    10. [1, 1, 7]])
    11. >>> x.repeat(2) #重复后变一维数组了
    12. array([4, 4, 4, 4, 9, 9, 1, 1, 1, 1, 7, 7])
    13. >>> x.repeat([2,3],axis=0) #第一行重复2次,第二行重复3次
    14. array([[4, 4, 9],
    15. [4, 4, 9],
    16. [1, 1, 7],
    17. [1, 1, 7],
    18. [1, 1, 7]])
    19. >>> x=np.random.randint(1,10,(2,3))
    20. >>> x
    21. array([[3, 6, 4],
    22. [1, 8, 6]])
    23. >>> np.tile(x,2) #铺瓷砖(不跨块)
    24. array([[3, 6, 4, 3, 6, 4],
    25. [1, 8, 6, 1, 8, 6]])
    26. >>> np.tile(x,3)
    27. array([[3, 6, 4, 3, 6, 4, 3, 6, 4],
    28. [1, 8, 6, 1, 8, 6, 1, 8, 6]])

    八、数组转置

    1. >>> b=np.array(([1,2,3],[4,5,6],[7,8,9]))
    2. >>> b
    3. array([[1, 2, 3],
    4. [4, 5, 6],
    5. [7, 8, 9]])
    6. >>> b.T #转置
    7. array([[1, 4, 7],
    8. [2, 5, 8],
    9. [3, 6, 9]])
    10. >>> a=np.array((1,2,3,4))
    11. >>> a
    12. array([1, 2, 3, 4])
    13. >>> a.T #一维数组转置后和原来是一样的
    14. array([1, 2, 3, 4])

    九、数组所有元素累计和与累计积

    1. >>> x=np.array([3,1,2,4])
    2. >>> x.cumsum() #累计和
    3. array([ 3, 4, 6, 10])
    4. >>> x.cumprod() #累计积
    5. array([ 3, 3, 6, 24])
    6. >>> x
    7. array([3, 1, 2, 4])

    十、数据的集合运算

    1. >>> np.intersect1d([1,3,4,2],[3,1,2,1]) #交集,返回有序数组。“1”是数字
    2. array([1, 2, 3])
    3. >>> from functools import reduce
    4. >>> reduce(np.intersect1d,([1,3,4,3],[3,1,2,1],[6,3,4,2]))
    5. array([3])
    6. >>> np.union1d([1,4,3,3],[3,1,2,1]) #并集,返回有序数组
    7. array([1, 2, 3, 4])
    8. >>> np.in1d([1,3,4,3],[3,1,2,1]) #前一个数组的每个元素是否在第二个数组中
    9. array([ True, True, False, True])
    10. >>> np.setdiff1d([1,3,4,3],[3,1,2,1]) #差集
    11. array([4])
    12. >>> np.setxor1d([1,3,4,3],[3,1,2,1]) #对称差集
    13. array([2, 4])

    十一、数组的点积/内积运算

    1. >>> import numpy as np
    2. >>> x=np.array((1,2,3))
    3. >>> y=np.array((4,5,6))
    4. >>> print(np.dot(x,y)) #输出结果都是32
    5. 32
    6. >>> print(x.dot(y))
    7. 32
    8. >>> print(sum(x*y))
    9. 32
    10. >>> a=np.array((5,6,7))
    11. >>> c=np.array(([1,2,3],[4,5,6],[7,8,9])) #二维数组
    12. >>> c.dot(a) #二维数组的每行与一维数组计算内积
    13. array([ 38, 92, 146])
    14. >>> c[0].dot(a) #验证一下,两个一维向量计算内积
    15. 38
    16. >>> c[1].dot(a)
    17. 92
    18. >>> c[2].dot(a)
    19. 146
    20. >>> a.dot(c) #一维向量与二维向量的每列计算内积
    21. array([ 78, 96, 114])
    22. >>> cT=c.T #转置
    23. >>> a.dot(cT[0]) #验证一下
    24. 78
    25. >>> a.dot(cT[1])
    26. 96
    27. >>> a.dot(cT[2])
    28. 114

    十二、访问数组中的元素

    1. >>>b=np.array(([1,2,3],[4,5,7],[7,8,9]))
    2. >>>b
    3. array([[1, 2, 3],
    4. [4, 5, 7],
    5. [7, 8, 9]])
    6. >>>b[0] #第零行所有元素
    7. array([1, 2, 3])
    8. >>>b[0][0] #第零行和第零列的元素
    9. 1
    10. >>>b[0,0] #第零行和第零列的元素
    11. 1
    12. >>>b[[0,1]] #第零行和第一列的所有元素,只指定行下标,不指定列下标,表示所有列
    13. array([[1, 2, 3],
    14. [4, 5, 7]])
    15. >>>b[[0,2,1],[2,1,0]] #第零行第二列,第二行第一列,第一行第零列;第一个列表表示行下标,第二列表表示列下标
    16. array([3, 8, 4])
    17. >>>a=np.arange(10)
    18. >>>a
    19. array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    20. >>>a[[2,4,6]] #可同时访问多个数组中的数据
    21. array([2, 4, 6])
    22. >>>x=np.random.randint(1,10,(2,3))
    23. >>>x
    24. array([[8, 2, 7],
    25. [6, 3, 8]])
    26. >>> x.take([0,4]) #第一个和第五个元素,行优先
    27. array([8, 3])
    28. >>> x.take([0,3])
    29. array([8, 6])
    30. >>> x.take([0,1],axis=0) #前两行
    31. array([[8, 2, 7],
    32. [6, 3, 8]])
    33. >>> x.take([0,1],axis=1) #前两列
    34. array([[8, 2],
    35. [6, 3]])
    36. >>> x=np.random.randint(1,10,(2,2,3))
    37. >>> x
    38. array([[[3, 6, 8],
    39. [8, 6, 2]],
    40. [[4, 9, 8],
    41. [6, 7, 5]]])
    42. >>> x.take(0,axis=0)
    43. array([[3, 6, 8],
    44. [8, 6, 2]])
    45. >>> x.take(0)
    46. 3
    47. >>> x.take(11)
    48. 5
    49. >>> x.take([0,1],axis=2)
    50. array([[[3, 6],
    51. [8, 6]],
    52. [[4, 9],
    53. [6, 7]]])
    54. >>> x.take([0,1],axis=1)
    55. array([[[3, 6, 8],
    56. [8, 6, 2]],
    57. [[4, 9, 8],
    58. [6, 7, 5]]])
    59. >>> x.take(1,axis=1)
    60. array([[8, 6, 2],
    61. [6, 7, 5]])
    62. >>> x[0]
    63. array([[3, 6, 8],
    64. [8, 6, 2]])
    65. >>> x[1]
    66. array([[4, 9, 8],
    67. [6, 7, 5]])
    68. >>> x[0][0]
    69. array([3, 6, 8])
    70. >>> x[0][0][2]
    71. 8

    十三、数组切片

    1. >>> a=np.arange(10)
    2. >>> a
    3. array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    4. >>> a[::-1] #反向切片
    5. array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
    6. >>> a[::2] #隔一个取一个元素
    7. array([0, 2, 4, 6, 8])
    8. >>> a[:5] #前五个元素
    9. array([0, 1, 2, 3, 4])
    10. >>> c=np.arange(25) #创建数组
    11. >>> c.shape=5,5 #修改数组形状
    12. >>> c
    13. array([[ 0, 1, 2, 3, 4],
    14. [ 5, 6, 7, 8, 9],
    15. [10, 11, 12, 13, 14],
    16. [15, 16, 17, 18, 19],
    17. [20, 21, 22, 23, 24]])
    18. >>> c[0,2:5] #第零行中下标[2,5)之间的元素值
    19. array([2, 3, 4])
    20. >>> c[1] #第一行所有元素,不指定列下标,表示所有列
    21. array([5, 6, 7, 8, 9])
    22. >>> c[2:5,2:5] #行下标和列下标都介于[2,5)之间的元素值
    23. array([[12, 13, 14],
    24. [17, 18, 19],
    25. [22, 23, 24]])
    26. >>> c[[1,3],[2,4]] #第一行第二列的元素和第三行第四列的元素
    27. array([ 7, 19])
    28. >>> c[[1,3],2:3] #第一行和第三行的二三列
    29. array([[ 7],
    30. [17]])
    31. >>> c[:,[2,4]] #第二列和第四列所有元素,对行下标进行切片,冒号表示所有行
    32. array([[ 2, 4],
    33. [ 7, 9],
    34. [12, 14],
    35. [17, 19],
    36. [22, 24]])
    37. >>> c[:,3] #第三列所有元素
    38. array([ 3, 8, 13, 18, 23])
    39. >>> c[[1,3]] #第一行和第三行所有元素
    40. array([[ 5, 6, 7, 8, 9],
    41. [15, 16, 17, 18, 19]])
    42. >>> c[[1,3]][:,[2,4]] #第一、三行的2、4列元素
    43. array([[ 7, 9],
    44. [17, 19]])

    十四、数组对函数运算的支持

    1. >>> x=np.arange(0,100,10,dtype=np.floating)
    2. Warning (from warnings module):
    3. File "", line 1
    4. DeprecationWarning: Converting `np.inexact` or `np.floating` to a dtype is deprecated. The current result is `float64` which is not strictly correct.
    5. >>> print(x)
    6. [ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90.]
    7. >>> print(np.sin(x)) #一维数组中所有元素求正弦值
    8. [ 0. -0.54402111 0.91294525 -0.98803162 0.74511316 -0.26237485
    9. -0.30481062 0.77389068 -0.99388865 0.89399666]
    10. >>> x=np.array(([1,2,3],[4,5,6],[7,8,9]))
    11. >>> print(x)
    12. [[1 2 3]
    13. [4 5 6]
    14. [7 8 9]]
    15. >>> print(np.cos(x)) #二维数组中所有元素求余弦值
    16. [[ 0.54030231 -0.41614684 -0.9899925 ]
    17. [-0.65364362 0.28366219 0.96017029]
    18. [ 0.75390225 -0.14550003 -0.91113026]]
    19. >>> print(np.round(np.cos(x))) #四舍五入
    20. [[ 1. -0. -1.]
    21. [-1. 0. 1.]
    22. [ 1. -0. -1.]]
    23. >>> print(np.ceil(x/2)) #向上取整
    24. [[1. 1. 2.]
    25. [2. 3. 3.]
    26. [4. 4. 5.]]
    27. >>> np.absolute(-3) #绝对值或模
    28. 3
    29. >>> np.isnan(np.NAN)
    30. True
    31. >>> np.log2(8) #对数
    32. 3.0
    33. >>> np.log10(100)
    34. 2.0
    35. >>> np.log10([100,100,10000])
    36. array([2., 2., 4.])
    37. >>> np.multiply(3,8)
    38. 24
    39. >>> np.multiply([1,2,3],[4,5,6])
    40. array([ 4, 10, 18])
    41. >>> np.multiply(3,[5,6])
    42. array([15, 18])
    43. >>> np.multiply(3,np.array([5,6]))
    44. array([15, 18])
    45. >>> np.sqrt([9,16,35])
    46. array([3. , 4. , 5.91607978])
    47. >>> np.sqrt(range(10))
    48. array([0. , 1. , 1.41421356, 1.73205081, 2. ,
    49. 2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])

    十五、改变数组形状

    1. >>> x=np.arange(1,11,1)
    2. >>> x
    3. array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    4. >>> x.shape #查看数组的形状
    5. (10,)
    6. >>> x.size #数组中元素的数量
    7. 10
    8. >>> x.shape=2,5 #改为2行5列
    9. >>> x
    10. array([[ 1, 2, 3, 4, 5],
    11. [ 6, 7, 8, 9, 10]])
    12. >>> x.shape
    13. (2, 5)
    14. >>> x.shape=5,-1 #-1表示自动计算
    15. >>> x
    16. array([[ 1, 2],
    17. [ 3, 4],
    18. [ 5, 6],
    19. [ 7, 8],
    20. [ 9, 10]])
    21. >>> x=x.reshape(2,5) #reshape()方法返回新数组
    22. >>> x
    23. array([[ 1, 2, 3, 4, 5],
    24. [ 6, 7, 8, 9, 10]])
    25. >>> x=np.array(range(5))
    26. >>> x.reshape((1,10)) #reshape()不能修改数组元素个数,出错
    27. Traceback (most recent call last):
    28. File "", line 1, in
    29. x.reshape((1,10))
    30. ValueError: cannot reshape array of size 5 into shape (1,10)
    31. >>> x.resize((1,10)) #resize()可以改变数组元素个数
    32. >>> x
    33. array([[0, 1, 2, 3, 4, 0, 0, 0, 0, 0]])
    34. >>> np.resize(x,(1,3)) #使用Numpy的resize()返回新数组
    35. array([[0, 1, 2]])
    36. >>> x #不对原数组进行任何修改
    37. array([[0, 1, 2, 3, 4, 0, 0, 0, 0, 0]])

    十六、数组扁平化,变为一维数组

    1. >>> arr=np.random.randint(1,10,(3,4))
    2. >>> arr
    3. array([[9, 3, 7, 4],
    4. [2, 2, 4, 6],
    5. [7, 8, 8, 8]])
    6. >>> arr.ravel() #默认行优先,C语言顺序
    7. array([9, 3, 7, 4, 2, 2, 4, 6, 7, 8, 8, 8])
    8. >>> arr.ravel('F') #列优先,Fortran顺序
    9. array([9, 2, 7, 3, 2, 8, 7, 4, 8, 4, 6, 8])
    10. >>> arr.flatten() #行优先
    11. array([9, 3, 7, 4, 2, 2, 4, 6, 7, 8, 8, 8])
    12. >>> arr.flatten('F') #列优先
    13. array([9, 2, 7, 3, 2, 8, 7, 4, 8, 4, 6, 8])
    14. >>> arr=np.random.randint(1,10,(2,3,4))
    15. >>> arr
    16. array([[[4, 1, 5, 8],
    17. [1, 8, 3, 1],
    18. [2, 2, 5, 6]],
    19. [[3, 8, 5, 2],
    20. [5, 2, 5, 3],
    21. [4, 4, 1, 3]]])
    22. >>> arr.flatten()
    23. array([4, 1, 5, 8, 1, 8, 3, 1, 2, 2, 5, 6, 3, 8, 5, 2, 5, 2, 5, 3, 4, 4,
    24. 1, 3])
    25. >>> arr.flatten('F')
    26. array([4, 3, 1, 5, 2, 4, 1, 8, 8, 2, 2, 4, 5, 5, 3, 5, 5, 1, 8, 2, 1, 3,
    27. 6, 3])

    十七、数组切分

    1. >>> np.split(np.array(range(10)),2)
    2. [array([0, 1, 2, 3, 4]), array([5, 6, 7, 8, 9])]
    3. >>> np.split(np.array(range(12)),3)
    4. [array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8, 9, 10, 11])]
    5. >>> np.split(np.array(range(16)).reshape((4,4)),2)
    6. [array([[0, 1, 2, 3],
    7. [4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
    8. [12, 13, 14, 15]])]

    十八、取整运算

    1. >>> x=np.random.rand(10)*50 #10个随机数
    2. >>> x
    3. array([16.69881646, 9.02845598, 39.62579936, 1.30399031, 42.20507989,
    4. 28.33553525, 10.56996153, 30.96119602, 7.90198546, 4.56703219])
    5. >>> np.int64(x) #取整
    6. array([16, 9, 39, 1, 42, 28, 10, 30, 7, 4], dtype=int64)
    7. >>> x-np.int64(x) #小数部分
    8. array([0.69881646, 0.02845598, 0.62579936, 0.30399031, 0.20507989,
    9. 0.33553525, 0.56996153, 0.96119602, 0.90198546, 0.56703219])

    十九、广播(数组与标量的加法)

    1. >>> a=np.arange(0,60,10).reshape(-1,1) #列向量
    2. >>> a
    3. array([[ 0],
    4. [10],
    5. [20],
    6. [30],
    7. [40],
    8. [50]])
    9. >>> b=np.arange(0,6) #行向量
    10. >>> b
    11. array([0, 1, 2, 3, 4, 5])
    12. >>> a[0]+b #数组与标量的加法
    13. array([0, 1, 2, 3, 4, 5])
    14. >>> a[1]+b
    15. array([10, 11, 12, 13, 14, 15])
    16. >>> a+b #广播
    17. array([[ 0, 1, 2, 3, 4, 5],
    18. [10, 11, 12, 13, 14, 15],
    19. [20, 21, 22, 23, 24, 25],
    20. [30, 31, 32, 33, 34, 35],
    21. [40, 41, 42, 43, 44, 45],
    22. [50, 51, 52, 53, 54, 55]])
    23. >>> a*b #广播
    24. array([[ 0, 0, 0, 0, 0, 0],
    25. [ 0, 10, 20, 30, 40, 50],
    26. [ 0, 20, 40, 60, 80, 100],
    27. [ 0, 30, 60, 90, 120, 150],
    28. [ 0, 40, 80, 120, 160, 200],
    29. [ 0, 50, 100, 150, 200, 250]])

    二十、计算唯一值以及出现次数

    1. >>> x=np.random.randint(0,10,7)
    2. >>> x
    3. array([0, 1, 5, 4, 1, 8, 2])
    4. >>> np.bincount(x) #元素出现次数,0出现1次……
    5. array([1, 2, 1, 0, 1, 1, 0, 0, 1], dtype=int64)
    6. >>> np.sum(_) #所有元素出现次数之和等于数组长度
    7. 7
    8. >>> len(x)
    9. 7
    10. >>> np.unique(x) #返回唯一元素值,把x变成集合类
    11. array([0, 1, 2, 4, 5, 8])
    12. >>> x=np.random.randint(0,10,2)
    13. >>> x
    14. array([8, 4])
    15. >>> np.bincount(x) #结果数组的长度取决于原始数组中最大元素值
    16. array([0, 0, 0, 0, 1, 0, 0, 0, 1], dtype=int64)
    17. >>> x=np.random.randint(0,10,10)
    18. >>> x
    19. array([3, 0, 3, 5, 4, 3, 8, 3, 0, 3])
    20. >>> y=np.random.rand(10) #随机小数,模拟权重
    21. >>> y=np.round_(y,1) #保留一位小数
    22. >>> np.sum(x*y)/np.sum(np.bincount(x)) #加权总和/出现总次数或元素个数
    23. 1.69
    24. >>> sum(x*y)/len(x) #数组支持python内置函数
    25. 1.69

    二十一、数组布尔运算

    1. >>>import numpy as np
    2. >>>x=np.random.rand(10) #包含10个随机数的数组
    3. >>>x
    4. array([0.25343298, 0.41688277, 0.98967738, 0.33084737, 0.97938066,
    5. 0.35567276, 0.79729858, 0.94640714, 0.19360246, 0.72732656])
    6. >>>x>0.5 #比较数组中每个元素是否大于0.5
    7. array([False, False, True, False, True, False, True, True, False,
    8. True])
    9. >>>x[x>0.5] #获取数组中大于0.5的元素,可用于检测和过滤异常值
    10. array([0.98967738, 0.97938066, 0.79729858, 0.94640714, 0.72732656])
    11. >>> x<0.5
    12. array([ True, True, False, True, False, True, False, False, True,
    13. False])
    14. >>> sum((x>0.4)&(x<0.6)) #值大于0.4且小于0.6的元素数量,True表示1,F表示0
    15. 1
    16. >>> np.all(x<1) #测试是否全部元素都小于1
    17. True
    18. >>> np.any(x>0.8) #是否存在大于0.8的元素
    19. True
    20. >>> a=np.array([1,2,3])
    21. >>> b=np.array([3,2,1])
    22. >>> a>b #两个数组中对应位置上的元素比较
    23. array([False, False, True])
    24. >>> a[a>b] #数组a中大于b数组对应位置上元素的值
    25. array([3])
    26. >>> a==b
    27. array([False, True, False])
    28. >>> a[a==b]
    29. array([2])
    30. >>> x=np.arange(1,10)
    31. >>> x
    32. array([1, 2, 3, 4, 5, 6, 7, 8, 9])
    33. >>> x[(x%2==0)&(x>5)] #大于5的偶数,两个数组进行布尔与运算
    34. array([6, 8])
    35. >>> x[(x%2==0)|(x>5)] #大于5的元素或者偶数元素,布尔或运算
    36. array([2, 4, 6, 7, 8, 9])
    37. >>> data=np.array([[1,2,3],[2,3,3],[3,4,5],[1,2,3],[4,5,6],[1,2,3]])
    38. >>> data==[1,2,3] #每行的每元素对应比较
    39. array([[ True, True, True],
    40. [False, False, True],
    41. [False, False, False],
    42. [ True, True, True],
    43. [False, False, False],
    44. [ True, True, True]])
    45. >>> index=list(map(lambda row:all(row==[1,2,3]),data))
    46. >>> print(index)
    47. [True, False, False, True, False, True]
    48. >>> data[index] #获取所有[1,2,3]的行
    49. array([[1, 2, 3],
    50. [1, 2, 3],
    51. [1, 2, 3]])

    二十二、分段函数

    1. >>> x=np.random.randint(0,10,size=(1,10))
    2. >>> x
    3. array([[5, 5, 4, 1, 8, 2, 9, 3, 9, 3]])
    4. >>> np.where(x<5,0,1) #小于5的元素值对应0,其他对应1
    5. array([[1, 1, 0, 0, 1, 0, 1, 0, 1, 0]])
    6. >>> x.resize((2,5)) #改变数组形状
    7. >>> x
    8. array([[5, 5, 4, 1, 8],
    9. [2, 9, 3, 9, 3]])
    10. >>> np.piecewise(x,[x<4,x>7],[lambda x:x*2,lambda x:x*3]) #小于4的元素*2,大于7的元素*3,其他元素为0
    11. array([[ 0, 0, 0, 2, 24],
    12. [ 4, 27, 6, 27, 6]])
    13. >>> np.piecewise(x,[x<3,(35),x>7],[-1,1,lambda x:x*4]) #<3的元素变为-1,大于3的元素变为1,大于7的元素*4
    14. array([[ 0, 0, 1, -1, 32],
    15. [-1, 36, 0, 36, 0]])

    二十三、删除数组中的元素

    1. >>> data=np.random.randint(1,100,(8,5))
    2. >>> data
    3. array([[33, 66, 84, 84, 45],
    4. [25, 12, 47, 42, 37],
    5. [45, 85, 35, 98, 4],
    6. [80, 84, 49, 98, 18],
    7. [85, 93, 69, 45, 46],
    8. [49, 80, 19, 44, 99],
    9. [60, 67, 22, 35, 81],
    10. [69, 51, 11, 72, 57]])
    11. >>> np.delete(data,0,axis=0) #删除下标为0的行,返回新数组
    12. array([[25, 12, 47, 42, 37],
    13. [45, 85, 35, 98, 4],
    14. [80, 84, 49, 98, 18],
    15. [85, 93, 69, 45, 46],
    16. [49, 80, 19, 44, 99],
    17. [60, 67, 22, 35, 81],
    18. [69, 51, 11, 72, 57]])
    19. >>> np.delete(data,3,axis=1) #删除下标为3的列,返回新数组
    20. array([[33, 66, 84, 45],
    21. [25, 12, 47, 37],
    22. [45, 85, 35, 4],
    23. [80, 84, 49, 18],
    24. [85, 93, 69, 46],
    25. [49, 80, 19, 99],
    26. [60, 67, 22, 81],
    27. [69, 51, 11, 57]])
    28. >>> np.delete(data,3) #删除按行存储的下标为3的元素,返回一维数组
    29. array([33, 66, 84, 45, 25, 12, 47, 42, 37, 45, 85, 35, 98, 4, 80, 84, 49,
    30. 98, 18, 85, 93, 69, 45, 46, 49, 80, 19, 44, 99, 60, 67, 22, 35, 81,
    31. 69, 51, 11, 72, 57])
    32. >>> np.delete(data,np.arange(0,len(data),2)) #删除偶数下标的元素,返回一维数组
    33. array([66, 84, 25, 47, 42, 37, 45, 85, 35, 98, 4, 80, 84, 49, 98, 18, 85,
    34. 93, 69, 45, 46, 49, 80, 19, 44, 99, 60, 67, 22, 35, 81, 69, 51, 11,
    35. 72, 57])
    36. >>> np.delete(data,[0,2,6,7]) #删除下标为0,2,6,7的元素
    37. array([66, 84, 45, 25, 42, 37, 45, 85, 35, 98, 4, 80, 84, 49, 98, 18, 85,
    38. 93, 69, 45, 46, 49, 80, 19, 44, 99, 60, 67, 22, 35, 81, 69, 51, 11,
    39. 72, 57])

  • 相关阅读:
    【算法练习Day16】找树左下角的值&&路径总和&& 从中序与后序遍历序列构造二叉树
    工业控制系统安全标准
    DNS服务器部署
    比肩GPT4,没有显卡也能用Llama-3.1-405B
    Python3-excel文档操作(四):利用openpyxl库处理excel表格:将数据进行可视化展示在Excel中
    B端系统:选抽屉弹出还是弹窗,是时候挑明了。
    VAPS XT开发入门教程03:程序目录说明
    C#面:请解释ASP.NET中的web页面与其隐藏类之间的关系
    【第三部分 | 移动端开发】1:移动端基础概要
    python之字符串及操作相关知识
  • 原文地址:https://blog.csdn.net/m0_72318954/article/details/127916597