Numpy(Numerical Python的缩写)

  • 一个开源的Python科学计算库
  • 使用Numpy可以方便的使用数组、矩阵进行计算
  • 包括线性代数、傅里叶变换、随机数生成等大量函数

为什么使用numpy

对于同样的数值计算任务,使用Numpy比直接编写Python代码实现,有以下优点

  • 代码更简洁:Numpy直接以数组、矩阵为粒度计算并且支持大量的数学函数,如果没有Numpy,Python需要for循环从底层实现
  • 性能更高效:Numpy的数组存储效率和输入输出计算性能比Python使用列表强很多。这里体现为两点。第一点,Numpy的数据存储和Python原生的List是不一样的,第二点,Numpy的大部分代码是C写的,效率比Python高。

Numpy是Python各种数据科学类库的基础库

比如:Scipy、Scikit-Learn、Tensorflow、PaddlePaddle等,如果不会Numpy,这些库的学习都会遇到障碍。

Numpy和原生Python的性能对比

需求:实现两个数组的加法

数组A是1~N数字的平方

数组B是1~N数字的立方

纯python实现

  1. def sum_add(n):
  2. """
  3. 纯python实现两个数组的加法
  4. :param n:
  5. :return:
  6. """
  7. square = [i ** 2 for i in range(1, n + 1)]
  8. cube = [i ** 3 for i in range(1, n + 1)]
  9. c = []
  10. for i in range(n):
  11. c.append(square[i] + cube[i])
  12. return c
  13. def numpy_add(n):
  14. """
  15. numpy实现两个数组的加法
  16. :param n:
  17. :return:
  18. """
  19. a = np.arange(n) ** 2
  20. b = np.arange(n) ** 3
  21. return a + b

numpy在使用之前需要导入numpy

  1. import numpy as pd

array的使用

array的背景

  • Numpy的核心数据结构,array就是数组,array对象可以是一维数组,也可以是多维数组;
  • Python的List可以实现相同的功能,但是array比List的优点在于性能好、包含数组元数据信息、大量的便捷函数;
  • Numpy成为事实上的Scipy、Pandas、Scikit-Learn、Tensorflow、PaddlePaddle等框架的“通用底层语言”
  • Numpy的array和Python的List的一个区别,是它元素必须都是同一种数据类型,比如都是数字int类型,这也是Numpy高性能的一个原因;

array本身的属性

  • shape:返回一个元组,表示array的维度
  • ndim:—个数字,表示array的维度的数目
  • size:—个数字,表示array中所有数据元褰的数目
  • dtype: array中元素的数据类型

写一个代码来测试这些属性

  1. """
  2. @description:使用Python的list和嵌套list来创建一维array和二位array
  3. @author:baola
  4. @time:2020/8/10 11:17
  5. @Python_version: 3.8.5
  6. """
  7. import numpy as np
  8. # 创建一个一维数组
  9. dim1= np.array([1, 2, 3, 4, 5, 6, 7, 8])
  10. # 创建一个二维数组
  11. dim2 = np.array(
  12. [
  13. [1, 2, 3, 4],
  14. [5, 6, 7, 8]
  15. ]
  16. )
  17. print('********dim1*******')
  18. print('dim1:', dim1)
  19. print('********dim2*******')
  20. print('dim2:', dim2, '\n')
  21. # array的属性
  22. print('dim1.shape: ', dim1.shape, 'dim1.ndim: ', dim1.ndim, ' dim1.size: ', dim1.size, ' dim1.type:', dim1.dtype)
  23. print('dim2.shape: ', dim2.shape, 'dim2.ndim: ', dim2.ndim, ' dim2.size: ', dim2.size, ' dim2.type:', dim2.dtype)

创建array的方法

方法1:从Python的列表List和嵌创list来创建一维array和二位array

  1. import numpy as pd
  2. # 创建一个一维数组
  3. dim1= np.array([1, 2, 3, 4, 5, 6, 7, 8])
  4. # 创建一个二维数组
  5. dim2 = np.array(
  6. [
  7. [1, 2, 3, 4],
  8. [5, 6, 7, 8]
  9. ]
  10. )
  11. print('********dim1*******')
  12. print('dim1:', dim1)
  13. print('********dim2*******')
  14. print('dim2:', dim2)

方法2:使用预定函数arange、ones/onesjike、zeros/zerosjike、empty/empty_like、full/fulljike、eye等函数创建

使用arange创建数字序列

  1. # arange([start,] stop[, step,], dtype=None) 和Python的range类似
  2. print(np.arange(10)) # [0 1 2 3 4 5 6 7 8 9]
  3. print(np.arange(2, 10, 2)) # [2 4 6 8]

使用ones创建全是1的数组

  1. # ones(shape, dtype=None, order='C')
  2. # 创建全是1的一维数组
  3. print(np.ones(10))
  4. # 创建一个3行4列全是1的数组
  5. print(np.ones((3, 4)))

使用ones_like创建形状相同的数组

  1. # Return an array of ones with the same shape and type as a given array.
  2. a = np.array(
  3. [
  4. [1, 2, 3, 4],
  5. [5, 6, 7, 8]
  6. ]
  7. ) # 之后的数组参数都用a演示
  8. print(np.ones_like(a))

zero/zeros_like和ones/ones_like用法和功能类似,产生的值全为0;

emptyempty_like根据给定的维度和数值类型返回一个新的数组,其元素不进行初始化(arbitrary data)。

  1. # empty 用的很少,创建一个未初始化的数组,数组的值是随机值
  2. # Return a new array of given shape and type, without initializing entries.
  3. print(np.empty(10))
  4. print((np.empty_like((2, 4))))
  5. # empty_like 用的很少,创建一个形状相同的数组,数组的值是随机值
  6. # Return a new array with the same shape and type as a given array.
  7. print(np.empty_like(a))

使用full创建指定值的数组

  1. """
  2. 使用full创建指定值的函数
  3. full(shape, fill_value, dtype=None, order='C')
  4. Return a new array of given shape and type, filled with `fill_value`.
  5. """
  6. print(np.full(10,333))
  7. print(np.full((2, 4), 666))
  8. """
  9. full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None)
  10. Return a full array with the same shape and type as a given array.
  11. """
  12. print(np.full_like(a, 666))

生成随机数的np.random模块构建随机数的数组

  1. """
  2. randn(d0, d1, ..., dn)
  3. """
  4. print(np.random.randn())
  5. print(np.random.randn(10))
  6. print(np.random.randn(2, 4))
  7. print(np.random.randn(2, 2, 2))

array本身支持的大置橾作和函数

  • 直接逐元素的加减乘除等算数操作
  • 更好用的面向多维的数组索引
  • 求sum/mean等聚合函数
  • 线性代数函数,比如求解逆矩阵、求解方程组

代码演示:

  1. # 改变array的形状
  2. print(np.arange(10).reshape(2, 5))
  3. """
  4. 输出:
  5. [[0 1 2 3 4]
  6. [5 6 7 8 9]]
  7. """
  8. """
  9. 对数组中每一个元素进行算数操作
  10. """
  11. a = np.arange(10).reshape(2, 5)
  12. print('a + 1 = ', a + 1)
  13. print('a - 1 = ', a - 1)
  14. print('a*2 = ', a*2)
  15. print('a/0.5', a/0.5)
  16. """
  17. 对两个数组之间的每个元素进行操作
  18. """
  19. b = np.arange(0, 20, 2).reshape(2, 5)
  20. print(np.arange(0, 20, 2))
  21. print('a+b = ', a+b) # 两个数组间的每个元素进行加法操作得到一个新的数组
  22. print('a-b = ', a-b)