Python 科学计算:在 Numpy 的边缘试探 (入门学习)

olei 2,793 views 0

NumPy 是 Python 在科学计算领域取得成功的关键之一,如果你想通过 Python 学习数据科学或者机器学习,就必须学习 NumPy。我认为 NumPy 的功能很强大,而且入门也不难。

数组基础

创建数组

  • NumPy 的核心是数组 (arrays)。具体来说是多维数组 (ndarrays),但是我们不用管这些。通过这些数组,我们能以闪电般的速度使用像向量和数学矩阵之类的功能。赶紧捡起你的线性代数吧!(只是开玩笑,其实并不需要很多复杂的数学知识)
Python
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 18/5/14 下午 2:23
  4. # @Author : Wugang Li
  5. # @File : np.py
  6. # @Software: PyCharm
  7. # @license : Copyright(C), iicats.com
  8. # @Contact : i@olei.me
  9.  
  10. import numpy as np
  11.  
  12. #创建数组
  13. a = np.array([0,1,2,3,4]) # [0 1 2 3 4]
  14. b = np.array([0,1,2,3,4]) # [0 1 2 3 4]
  15. c = np.arange(5) # [0 1 2 3 4]
  16. d = np.linspace(0, 2 * np.pi, 5) # [ 0. 1.57079633 3.14159265 4.71238898 6.28318531]
  17. print(a[3]) # 3
复制 文本 高亮

其中的 linspace 的意思是:

  • np.linspace(start,end,num), 产生一等差数组,一共产生 num 个数,整个数组分成 num-1 段,总长度 num-start,所以每段是 unit=(num-start)/(num-1)
  • 比如:np.linspace(0,1,12),每个数从 start 开始,每次加 unit. 上式是一共产生 12 个数,分成 11 段,总长 12-0,所以每段 12/11。所以从 0 开始,每次加 12/11.

表示矩阵

Python
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 18/5/15 下午 2:52
  4. # @Author : Wugang Li
  5. # @File : juzhen.py
  6. # @Software: PyCharm
  7. # @license : Copyright(C), iicats.com
  8. # @Contact : i@olei.me
  9.  
  10. import numpy as np
  11.  
  12. a = np.array(
  13. [
  14. [11, 12, 13, 14, 15],
  15. [16, 17, 18, 19, 20],
  16. [21, 22, 23, 24, 25],
  17. [26, 27, 28, 29, 30],
  18. [31, 32, 33, 34, 35]
  19. ]
  20. )
  21. print(a[2, 4]) # 25
  22.  
  23. b = a[0, 1:4]
  24. print(b) # [12,13,14]
  25.  
  26. c = a[1:4, 0]
  27. print(c) # [16,21,26]
  28.  
  29. d = a[::2, ::2]
  30. print(d)
  31. # [[11 13 15]
  32. # [21 23 25]
  33. # [31 33 35]]
  34.  
  35. e = a[:,1]
  36. print(e)
  37. # [12 17 22 27 32]
复制 文本 高亮

上面展示的了矩阵的创建,以及矩阵的切片操作~

一些方法

Python
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 18/5/15 下午 3:11
  4. # @Author : Wugang Li
  5. # @File : juzhen_method.py
  6. # @Software: PyCharm
  7. # @license : Copyright(C), iicats.com
  8. # @Contact : i@olei.me
  9.  
  10. import numpy as np
  11.  
  12. a = np.array(
  13. [
  14. [11, 12, 13, 14, 15, 0],
  15. [16, 17, 18, 19, 20, 1],
  16. [21, 22, 23, 24, 25, 2],
  17. [26, 27, 28, 29, 30, 3],
  18. [31, 32, 33, 34, 35, 4]
  19. ]
  20. )
  21.  
  22. print(type(a)) # <class 'numpy.ndarray'>
  23. print(a.dtype) # int64,总大小的字节
  24. print(a.size) # 30
  25. print(a.shape) # (5,6),表示五行五列
  26. print(a.itemsize) # 每一个条目所占的字节,8bit 为 1 字节,一个 int64 大小为 64bite,64 / 8 = 8
  27. print(a.ndim) # 2,表示二维数组
  28. print(a.nbytes) # 240,8x30
复制 文本 高亮

nbytes 表示这个数组中所有元素占用的字节数。你应该注意,这个数值并没有把额外的空间计算进去,因此实际上这个数组占用的空间会比这个值大点

使用数组

基本操作符

Python
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 18/5/15 下午 3:21
  4. # @Author : Wugang Li
  5. # @File : juzhen_ys.py
  6. # @Software: PyCharm
  7. # @license : Copyright(C), iicats.com
  8. # @Contact : i@olei.me
  9.  
  10. import numpy as np
  11.  
  12. a = np.arange(25)
  13.  
  14. print(a)
  15. # [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]
  16. a = a.reshape((5, 5))
  17. # [[ 0 1 2 3 4]
  18. # [ 5 6 7 8 9]
  19. # [10 11 12 13 14]
  20. # [15 16 17 18 19]
  21. # [20 21 22 23 24]]
  22. print(a)
  23.  
  24. b = np.array(
  25. [10, 62, 1, 14, 2, 56, 79, 2, 1, 45, 4, 92, 5, 55, 63, 43, 35, 6, 53, 24, 56, 3, 56, 44, 78]
  26. )
  27. b = b.reshape((5, 5))
  28. print(b)
  29. # [[10 62 1 14 2]
  30. # [56 79 2 1 45]
  31. # [ 4 92 5 55 63]
  32. # [43 35 6 53 24]
  33. # [56 3 56 44 78]]
  34.  
  35. print(a + b)
  36. print(b - a)
  37. print(a * b)
  38. print(a / b)
  39. print(a ** 2)
  40. print(a < b)
  41. print(b < a)
  42. print(a.dot(b)) # 点积,a 的第一行与 b 的第一列对应的元素相乘的和为新产生的第一个元素
  43. # [[ 417 380 254 446 555]
  44. # [1262 1735 604 1281 1615]
  45. # [2107 3090 954 2116 2675]
  46. # [2952 4445 1304 2951 3735]
  47. # [3797 5800 1654 3786 4795]]
复制 文本 高亮
  • 其中的 reshape 是对原数组,进行重新分配,样式弄成多行多列的矩阵形式
  • dot() 函数,是矩阵之间的点积
    Source Code
    1. a 的第一行与 b 的第一列对应的元素相乘的和为新产生的第一个元素,比如第一行的第一个、第二个就是:
    复制 文本 高亮
  • Source Code
    1. 0*10 + 1 * 56 + 2 * 4 + 3 * 43 + 4 * 56
    复制 文本 高亮
  • Source Code
    1. 0 * 62 + 1 * 79 + 2 * 92 + 3 * 35 + 4 * 3
    复制 文本 高亮
  • 还不清楚的话,看下面的这幅图:

Python科学计算:在Numpy的边缘试探(入门学习)

数组的特定操作符

  • NumPy 还提供了一些其他很有用的操作符,用于处理数组。
Python
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 18/5/15 下午 4:56
  4. # @Author : Wugang Li
  5. # @File : spectal_juzhen.py
  6. # @Software: PyCharm
  7. # @license : Copyright(C), iicats.com
  8. # @Contact : i@olei.me
  9.  
  10. import numpy as np
  11.  
  12. a = np.arange(10)
  13. print(a)
  14.  
  15. print(a.sum()) # 45
  16. print(a.max()) # 0
  17. print(a.min()) # 9
  18. print(a.cumsum()) # [ 0 1 3 6 10 15 21 28 36 45]
复制 文本 高亮
  • 很明显就能看出 sum()、min() 和 max() 函数的功能:将所有元素加起来,找到最小值和最大值。

  • cumsum() 函数就不是那么明显了。它像 sum() 那样把所有元素加起来,但是它的实现方式是,第一个元素加到第二个元素上,把结果保存到一个列表里,然后把结果加到第三个元素上,再保存到列表里,依次累加。当遍历完数组中所有元素则结束,返回值为运行数组的总和的列表。

  •  其实 cumsum() 就是一个累加计算并且保存每次累加的结果,返回值就是包含所有累加结果的一个列表。比如 np.array([1, 2, 3, 4, 5]).cumsum() = [1, 3, 6, 10, 15]

高级索引

花俏的索引

  • 「花俏的索引」 是获取数组中我们想要的特定元素的有效方法。
Python
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 18/5/15 下午 5:13
  4. # @Author : Wugang Li
  5. # @File : high_juzhen.py
  6. # @Software: PyCharm
  7. # @license : Copyright(C), iicats.com
  8. # @Contact : i@olei.me
  9.  
  10. import numpy as np
  11.  
  12. a = np.arange(0, 100, 10)
  13.  
  14. print(a) # [ 0 10 20 30 40 50 60 70 80 90]
  15.  
  16. indics = [0, 1, 5, -1]
  17. b = a[indics]
  18. print(b) # [0,10 50 90]
复制 文本 高亮
  • 布尔屏蔽 (boolean masking)

布尔屏蔽是一个奇妙的特性,它允许我们根据指定条件获取数组中的元素。

Python
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 18/5/15 下午 5:56
  4. # @Author : Wugang Li
  5. # @File : boolen_masking.py
  6. # @Software: PyCharm
  7. # @license : Copyright(C), iicats.com
  8. # @Contact : i@olei.me
  9.  
  10. import matplotlib.pyplot as plt
  11. import numpy as np
  12.  
  13. a = np.linspace(0, 2 * np.pi, 50)
  14. print(a)
  15. b = np.sin(a)
  16. print(b)
  17. plt.plot(a,b)
  18. mask = b >= 0
  19. plt.plot(a[mask], b[mask], 'bo')
  20. mask = (b >= 0) & (a <= np.pi / 2)
  21. plt.plot(a[mask], b[mask], 'go')
  22. plt.show()
复制 文本 高亮

出现下面的图:

Python科学计算:在Numpy的边缘试探(入门学习)

我们用条件式选择了图中不同的点。蓝色的点 (也包含图中的绿点,只是绿点覆盖了蓝点),显示的是值大于零的点。绿点显示的是值大于 0 小于 Pi / 2 的点。

缺省索引 && Where 函数

Python
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 18/5/15 下午 6:15
  4. # @Author : Wugang Li
  5. # @File : quexing_index_juzhen.py
  6. # @Software: PyCharm
  7. # @license : Copyright(C), iicats.com
  8. # @Contact : i@olei.me
  9.  
  10. import numpy as np
  11.  
  12. a = np.arange(0, 100, 10)
  13. print(a) # [ 0 10 20 30 40 50 60 70 80 90]
  14. b = a[:5]
  15. c = a[a >= 50]
  16. print(b) # [ 0 10 20 30 40]
  17. print(c) # [50 60 70 80 90]
  18.  
  19. d = np.where(a < 50)
  20. print(d) # (array([0, 1, 2, 3, 4]),)
  21. e = np.where(a > 50)[0]
  22. print(e) # [6 7 8 9]
复制 文本 高亮

发表评论 取消回复
表情 图片 链接 代码

分享