当前位置:   article > 正文

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

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 "<pyshell#67>", 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 "<pyshell#14>", line 1, in <module>
  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,(3<x)&(x<5),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])

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/615613
推荐阅读
相关标签
  

闽ICP备14008679号